2012-05-17 3 views
1

이것은 기본적으로 내가하려는 일입니다.파일 -> 바이트 [] -> 문자열 -> 바이트 [] -> 파일 변환

나는 문자열을 검색 MySQL의 테이블

의 String

스토어 그것으로 바이트 배열로 파일을

의 전원을 켭니다

전원을 켜고 그것을

전원을 켜고 그것을 가지고 싶어 그것을 다시 바이트 배열로 변환

T 다시 파일로 돌려 보내십시오.

이제, 제가 할 수있는 한 최선을 다하려고 노력한 코드가 있습니다. 내 문제는이 코드의 마지막 부분에있는 파일이 제대로 나오지 않는다는 것입니다. 정보가 누락되었습니다. 이 파일은 텍스트 파일이므로 파일이 완전한지 아닌지를 알 수 있어야합니다.

필자가 볼 수있는 한, 전체 파일이 아니라 파일의 마지막 부분 만 얻는 것 같습니다. 나는이 전환의 어떤 곳을 나쁘게 어수선하게 만들었다. 이 변환 및 검색을보다 효율적으로 수행하는 방법에 대한 제안이있는 경우 (여전히 데이터베이스와 모든 것을 염두에 두십시오) 알려 주시기 바랍니다!

코드는

import java.io.*; 
import java.util.StringTokenizer; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class main { 
    public static void main(String[] args) { 
     // The file we want to save. 
     File f = new File("build.xml"); 
     try { 
      // Make it into a byte array first 
      FileInputStream fis = new FileInputStream(f); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] buf = new byte[1024]; 
      try { 
       for(int readNum; (readNum = fis.read(buf)) != -1;) { 
        bos.write(buf, 0, readNum); 
        System.out.println("read " + readNum + " bytes,"); 
       } 
       StringBuilder s = new StringBuilder(); 
       // Now we simulate making it into a String, for easier storage 
       // in a database. 
       for(byte b : buf) { 
        // for debugging 
        s.append(b).append(","); 
        System.out.print(b +","); 
       } 
       // Now we want to retrieve the file from the database as a string 
       File someFile = new File("build2.xml"); 
       FileOutputStream fos = new FileOutputStream(someFile); 
       // We count how many bytes there are in this string. 
       // One byte per Token. 
       StringTokenizer st = new StringTokenizer(s.toString(),","); 
       buf = new byte[st.countTokens()]; 
       int i = 0; 
       StringBuilder t = new StringBuilder(); 
       // Now we parse out all Bytes from the string, and put them into 
       // the prepared byte array. 
       while(st.hasMoreTokens()) { 
        byte b = Byte.parseByte(st.nextToken()); 
        System.out.print(b + ","); 
        buf[i] = b; 
        i++; 
        // for debugging 
        t.append(b).append(","); 
       } 
       // Here I print true if both strings are exactly the same 
       // which they should be, which means that the bytes are intact 
       // before and after conversion. 
       System.out.println("\n" +(t.toString().equals(s.toString()) ? true : false)); 
       // Here we would make the physical file on the machine. 
       fos.write(buf); 
       fos.flush(); 
       fos.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 
당신은 단순히 문자열 생성을 엉망

http://pastebin.com/699yuE8f

+2

향후 귀하의 질문에 직접 코드를 게시하십시오. –

+0

나는 항상 틀린 것을 얻고, 그 후에 체재는 무섭게 본다. – OmniOwl

+4

코드 샘플을 사용하여 텍스트와 구별합니다. – Venki

답변

2

귀하의 접근 방식은 인코딩을 완전히 무시하고있는 것이 좋지 않습니다. 문자는 이 아니고은 바이트와 같거나 같습니다. 당신이 설명하는 순서를해야 할 경우

,이 같은 것을하여 문자열을 만들 :

String intermediateString = new String(theByteArray, 
             theSameEncodingTheFileWasCreatedWith); 

을 마찬가지로, 당신은 바이트로 다시 문자열을 변환 할 때,이 같은 바이트를 얻을 :

byte[] bytesToSave = intermediateString.getBytes(theSameEncodingTheFileWasCreatedWith); 

그러나 그 외에도 문자열을 전혀 사용하지 않는 이유는 무엇입니까? 바이트를 데이터베이스에 바로 저장하지 않는 이유는 무엇입니까?

+0

이전에는 데이터베이스에 바이트를 저장 한 적이 없으므로 좀 더 익숙한 것으로 생각하고 저장하려고했습니다. 하지만 인코딩을 생각할 필요없이 전에 바이트 배열을 파일로 변환했습니다. 예 .. 예. – OmniOwl

+0

바이트 배열을 파일로 저장할 때 엔코딩을 신경 쓸 필요가 없습니다. 바이트는 바이트입니다. 인코딩의 필요성은 문자열이 프로세스의 중간에있을 때 발생합니다. bytes -> string 및 string -> bytes는 인코딩을 처리해야한다는 것을 의미합니다. – QuantumMechanic

+0

@Vipar : 저장하려고하는 바이트의 종류가 큰 차이가 있습니다. QuantumMechanic이 맞습니다.'char'! ='byte'! 파일 *에있는 텍스트를 데이터베이스에 저장하려고합니까? 아니면 파일을 다시 구성 할 수있는 텍스트 데이터를 저장하려고합니까 *? 후자를 원한다면 실제 바이트를 BLOB로 저장하는 것이 가장 좋은 이유는 무엇입니까? –

1

아래에 나열되어, 당신은 bos하지만 buf을 읽을 수 없습니다.

  for(byte b : >>buf<<) { 
       // for debugging 
       s.append(b).append(","); 
       System.out.print(b +","); 
      } 

그렇지 않으면 작동하지 않거나 좋은 해결책이라고 확신하지 못합니다. 왜 단순히 데이터베이스에 저장할 수 없습니까?

+0

실제 파일이 아닌 일반 텍스트로 저장하려고합니다. – OmniOwl

+1

@Vipar : 임의의 바이너리 데이터를 문자열로 저장하는 것은 잘 알려진 문제입니다. 일반적인 해결책은 자신의 인코딩을 고안하는 대신 [base64] (http://en.wikipedia.org/wiki/Base64)와 같은 것을 사용하는 것입니다. –

0

내가 공유 한 코드는 IMHO보다 복잡합니다.

왜 문자열 표현에만 관심이 있다면 바이트 수준에서 텍스트를 읽습니까?

InputStreamReader을 사용하여 파일을 읽는 것이 좋습니다. 따라서 문자를 직접 조작 할 수 있습니다.

+0

거칠 필요가 없습니다. 나는 여기서 어둠 속에서 촬영하고있다. 그래도 입력 주셔서 감사합니다. – OmniOwl

+0

내 대답이 거친 이유가 확실하지 않습니다. 나는 직접적인 대답이 바로 당신을 그 지점으로 데려 간다. 코드가 길어질수록 코더가 버그를 배치 할 가능성이 커집니다. – Robert

관련 문제