137 lines
4.9 KiB
Java
137 lines
4.9 KiB
Java
|
|
/*
|
||
|
|
* The Broad Institute
|
||
|
|
* SOFTWARE COPYRIGHT NOTICE AGREEMENT
|
||
|
|
* This software and its documentation are copyright 2009 by the
|
||
|
|
* Broad Institute/Massachusetts Institute of Technology. All rights are reserved.
|
||
|
|
*
|
||
|
|
* This software is supplied without any warranty or guaranteed support whatsoever. Neither
|
||
|
|
* the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
|
||
|
|
*/
|
||
|
|
package edu.mit.broad.sam.util;
|
||
|
|
|
||
|
|
public class StringUtil {
|
||
|
|
/**
|
||
|
|
*
|
||
|
|
* @param separator String to interject between each string in strings arg
|
||
|
|
* @param strings List of strings to be joined.
|
||
|
|
* @return String that concatenates each item of strings arg, with separator btw each of them.
|
||
|
|
*/
|
||
|
|
public static String join(final String separator, final String[] strings) {
|
||
|
|
if (strings.length == 0) {
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
final StringBuilder ret = new StringBuilder(strings[0]);
|
||
|
|
for (int i = 1; i < strings.length; ++i) {
|
||
|
|
ret.append(separator);
|
||
|
|
ret.append(strings[i]);
|
||
|
|
}
|
||
|
|
return ret.toString();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Split the string into tokesn separated by the given delimiter. Profiling has
|
||
|
|
* revealed that the standard string.split() method typically takes > 1/2
|
||
|
|
* the total time when used for parsing ascii files.
|
||
|
|
*
|
||
|
|
* @param aString the string to split
|
||
|
|
* @param tokens an array to hold the parsed tokens
|
||
|
|
* @param delim character that delimits tokens
|
||
|
|
* @return the number of tokens parsed
|
||
|
|
*/
|
||
|
|
public static int split(final String aString, final String[] tokens, final char delim) {
|
||
|
|
|
||
|
|
final int maxTokens = tokens.length;
|
||
|
|
int nTokens = 0;
|
||
|
|
int start = 0;
|
||
|
|
int end = aString.indexOf(delim);
|
||
|
|
if(end < 0) {
|
||
|
|
tokens[nTokens++] = aString;
|
||
|
|
return nTokens;
|
||
|
|
}
|
||
|
|
while ((end > 0) && (nTokens < maxTokens))
|
||
|
|
{
|
||
|
|
tokens[nTokens++] = aString.substring(start, end);
|
||
|
|
start = end + 1;
|
||
|
|
end = aString.indexOf(delim, start);
|
||
|
|
|
||
|
|
}
|
||
|
|
// Add the trailing string, if there is room and if it is not empty.
|
||
|
|
if (nTokens < maxTokens)
|
||
|
|
{
|
||
|
|
final String trailingString = aString.substring(start);
|
||
|
|
if (trailingString.length() > 0)
|
||
|
|
{
|
||
|
|
tokens[nTokens++] = trailingString;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nTokens;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////
|
||
|
|
// The following methods all convert btw bytes and Strings, without
|
||
|
|
// using the Java character set mechanism.
|
||
|
|
////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
public static String bytesToString(final byte[] data) {
|
||
|
|
if (data == null) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
return bytesToString(data, 0, data.length);
|
||
|
|
}
|
||
|
|
|
||
|
|
@SuppressWarnings("deprecation")
|
||
|
|
public static String bytesToString(final byte[] buffer, final int offset, final int length) {
|
||
|
|
/*
|
||
|
|
The non-deprecated way, that requires allocating char[]
|
||
|
|
final char[] charBuffer = new char[length];
|
||
|
|
for (int i = 0; i < length; ++i) {
|
||
|
|
charBuffer[i] = (char)buffer[i+offset];
|
||
|
|
}
|
||
|
|
return new String(charBuffer);
|
||
|
|
*/
|
||
|
|
return new String(buffer, 0, offset, length);
|
||
|
|
}
|
||
|
|
|
||
|
|
@SuppressWarnings("deprecation")
|
||
|
|
public static byte[] stringToBytes(final String s) {
|
||
|
|
/*
|
||
|
|
The non-deprecated way, that requires allocating char[]
|
||
|
|
final byte[] byteBuffer = new byte[s.length()];
|
||
|
|
final char[] charBuffer = s.toCharArray();
|
||
|
|
for (int i = 0; i < charBuffer.length; ++i) {
|
||
|
|
byteBuffer[i] = (byte)(charBuffer[i] & 0xff);
|
||
|
|
}
|
||
|
|
return byteBuffer;
|
||
|
|
*/
|
||
|
|
final byte[] byteBuffer = new byte[s.length()];
|
||
|
|
s.getBytes(0, byteBuffer.length, byteBuffer, 0);
|
||
|
|
return byteBuffer;
|
||
|
|
}
|
||
|
|
|
||
|
|
// This method might more appropriately live in BinaryCodec, but all the byte <=> char conversion
|
||
|
|
// should be in the same place.
|
||
|
|
public static String readNullTerminatedString(final BinaryCodec binaryCodec) {
|
||
|
|
final StringBuilder ret = new StringBuilder();
|
||
|
|
for (byte b = binaryCodec.readByte(); b != 0; b = binaryCodec.readByte()) {
|
||
|
|
ret.append((char)(b & 0xff));
|
||
|
|
}
|
||
|
|
return ret.toString();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convert chars to bytes merely by casting
|
||
|
|
* @param chars input chars
|
||
|
|
* @param charOffset where to start converting from chars array
|
||
|
|
* @param length how many chars to convert
|
||
|
|
* @param bytes where to put the converted output
|
||
|
|
* @param byteOffset where to start writing the converted output.
|
||
|
|
*/
|
||
|
|
public static void charsToBytes(final char[] chars, final int charOffset, final int length,
|
||
|
|
final byte[] bytes, final int byteOffset) {
|
||
|
|
for (int i = 0; i < length; ++i) {
|
||
|
|
bytes[byteOffset + i] = (byte)chars[charOffset + i];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|