Simple, concise Java examples that do useful things.

Saturday, September 16, 2006

All purpose String trimmer

The java string class supports a trim() operation that trims ' '. You may find that you want to trim another character. This terse example will trim any character from the beginning and end of a String. It is based on the JDK's trim() method with a few more attempts at brevity.



public static String trim(String source, char c) {
int len = source.length();
int st = 0;
char[] val = source.toCharArray();
for (;(st < len) && (val[st] <= c);st++){}
for (;(st < len) && (val[len-1]<=c);len--){}
return ((st > 0) || (len < source.length())) ?
source.substring(st, len) : source;
}

Saturday, September 02, 2006

XMP Dumper reduced

I was able to trim this one down a bit more.


import java.io.*;

public class XMPDumper {

public String getXMP(File f) throws IOException {
return getXMP(new FileInputStream(f));
}

public String getXMP(InputStream is)
throws IOException {
for (int i=0;(i=is.read())!=-1;)
if (i==0xFF && is.read()==0xE1) {
String result = getXMPSegment(is);
if (result.startsWith("http://ns.adobe.com/xap/1.0/"))
return result.substring(29);
}
return null;
}

private String getXMPSegment(InputStream is)
throws IOException {
DataInputStream dis = new DataInputStream(is);
byte[] buffer = new byte[dis.readShort()-2];
dis.read(buffer);
return new String(buffer);
}
}

Saturday, August 26, 2006

Friday, August 25, 2006

XMP metadata dumper

XMP is a metatdata format from Adobe. One way to add and edit XMP is with PixVue. This is a minimalist XMP extractor/dumper for the jpeg format.


import java.io.*;

public class XMPDumper {

public static void main(String[] args) throws IOException {
File f = new File("myimage.jpg");
String xmp = new XMPDumper().getXMP(f);
System.out.println(xmp);
}

public String getXMP(File f)
throws IOException {
FileInputStream is = new FileInputStream(f);
int i=0; String result=null;
while ((i=is.read()) != -1)
if (i==0xFF && is.read()==0xE1) {
result = checkNamespace(is);
if (result!=null) break;
}
return result;
}

public static final String namespace =
"http://ns.adobe.com/xap/1.0/";

private String checkNamespace(FileInputStream is)
throws IOException {
String s = getSegment(is);
return (s.startsWith(namespace)) ? s.substring(29) : null;
}

private String getSegment(InputStream is)
throws IOException {
DataInputStream dis = new DataInputStream(is);
byte[] buffer = new byte[dis.readShort()-2];
dis.read(buffer);
return new String(buffer);
}
}

Resource Consumption Management API

Resource Consumption Management API JSR

This sounds like JINI or JMX to me...the JCP is becomming an echo chamber.

Thursday, August 24, 2006

Simple template replacer

Often I find I need a simple template engine to replace named regions.



public abstract class Replace {

public static void main(String[] args) {
Replace r = new Replace() {
public String lookup(String key) {
return "*newvalue*";
}
};
String s =
"Welcome ${name}, you have just won a new ${prize}.";
System.out.println(r.replace(s));
}

public String replace(String s) {
return replace(s, 0, new StringBuilder()).toString();
}

private StringBuilder replace(String s, int offset, StringBuilder b) {
int startKey = s.indexOf("${", offset);
if (startKey == -1)
return b.append(s.substring(offset));
else {
b.append(s.substring(offset, startKey));
int keyEnd = s.indexOf('}', startKey);
String key = s.substring(startKey + 2, keyEnd);
b.append(lookup(key));
return replace(s, keyEnd + 1, b);
}
}

abstract public String lookup(String key);
}