2010-04-23 6 views
1

데이터베이스의 CHAR 필드에 저장하려면 Vector를 String으로 변환해야합니다. 그 반대의 경우도 마찬가지입니다. 가장 효율적인 방법은 무엇입니까?<String> to String

답변

10

내가 직설로 만들자 ... 나중에 배열로 다시 구성 할 수 있도록 단일 열의 DB에 일부 형식 (예 : CSV)의 문자열 배열을 저장하려고합니까? 이것은 매우 나쁜 생각입니다. 나는 이것을 정확하게 알고 있기 때문에 나는 매일이 일을 매일 매일하는 것으로 고통 받아야한다. 유지 관리하는 것은 끔찍한 일이며,이 데이터를 쿼리하고 싶다면 코드가 매우 복잡 할 것입니다. 정말, 당신은 이러한 문자열 (각 행이 하나의 문자열)에 대한 별도의 테이블을 가지고 현재 테이블의 "문자열 배열"열을이 새로운 테이블의 외래 키로 대체하도록 데이터베이스를 정규화해야합니다.

1

당신은 (commons-lang에서) 시도 할 수 있습니다 : 문자열의

ArrayUtils.toString(vector.toArray()); 
2

벡터는 관계형 데이터베이스 모델에 오히려 잘 변환합니다. Vector 인덱스는 테이블 id 필드와 비슷하며 String은 CHAR 필드로 잘 변환됩니다. 이 형식으로 데이터를 저장하는 것이 더 자연 스럽습니다. 나중에 Vector가 필요하면 단일 직렬화 된 필드에 저장하는 대신 벡터를 재구성하십시오.

0

당신이하고있는 일이 좋은 것인지 아닌지 생각해 보면, 나는 아마도 stringstream과 for 루프를 만들어서 stringstream에 쓴다. 마지막에 str()을 호출하십시오. 왜 그런 명백한 해결책보다 더 복잡 할 필요가 있는지 확신 할 수 없습니다.

0

임의의 벡터에 대한 일반적인 전략은 벡터를 바이트로 직렬화 한 다음 데이터를 손실하지 않고 바이트를 문자열로 변환하는 것입니다.

다음 예제에서는 ByteArrayInput/OutputStream을 사용하여 메모리에 바이트 배열을 저장하고 char 당 2 바이트를 압축하여 결과를 인코딩합니다. 데이터베이스에서 문자열을 다른 로케일로 투명하게 변환하는 경우 byte []를 String으로 변환하는 다른 전략 (예 : base64)을 사용해야 할 수도 있습니다. 또는 데이터베이스 열을 BLOB로 변경하는 것을 고려하십시오. 그렇게하면 직렬화 된 데이터를 메모리에 보관할 필요가 없으며 Vector가 클 경우 중요 할 수 있습니다.

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.Vector; 

public class a { 
    public static void main(String[] args) throws Exception { 
    Vector<Object> v = new Vector<Object>(); 
    v.add("hello"); 
    v.add(1); 
    v.add(true); 
    v.add(v); 
    System.out.println(deserialize(serialize(v))); 
    } 

    private static String serialize(Object o) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(baos); 
    oos.writeObject(o); 
    oos.close(); 

    byte[] bytes = baos.toByteArray(); 
    char[] chars = new char[(bytes.length + 1)/2]; 

    for (int ci = 0, bi = 0; ci < chars.length; ci++) { 
     chars[ci] = (char)(bytes[bi++] << 8); 
     if (bi < bytes.length) { 
     chars[ci] |= (char)(bytes[bi++] & 0xff); 
     } 
    } 

    return new String(chars); 
    } 

    private static Object deserialize(String s) 
     throws IOException, ClassNotFoundException { 
    byte[] bytes = new byte[s.length() * 2]; 
    for (int ci = 0, bi = 0; ci < s.length(); ci++) { 
     bytes[bi++] = (byte)(s.charAt(i) >> 8); 
     bytes[bi++] = (byte)s.charAt(i); 
    } 

    return new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject(); 
    } 
}