2011-01-15 2 views
0

파일에서 바이트 []를 쓰고로드하는 간단한 (뭔가 외부 라이브러리가없는 것이 좋음) 찾고 있습니다. 다소 [파이썬 피클] [1]과 같은 것입니다.파일에서 바이트 [] 쓰기 및 읽기

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = new ByteBuffer.allocate(bytes.length); 
bbuf.wrap(bytes); // edited due to Jon Skeet's answer 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

문제는 내가 그런 파일에서 Object 구조를 읽을 수없는 것으로 보입니다. 16 진수 편집기에서 "somebytes"파일은 단지 몇 또는 0을 포함합니다. 그래서 FileOutputStream은 내용 ("t"또는 바이트 - 상당)을 그 안에 넣는 것처럼 보이지 않습니다.

[1] http://wiki.python.org/moin/UsingPickle 당신은 크기의bytes와 바이트 버퍼를 할당했지만, 그 바이트 버퍼 바이트 배열과 연관되는 것을 의미하지 않는다

답변

4

. ByteBuffer.wrap을 사용하여 바이트 배열을 래핑 할 수 있습니다. 실제 코드에 대한 당신이 시도/마침내 확인 파일이 항상 닫혀 있도록 차단 사용해야

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = ByteBuffer.wrap(bytes); 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

참고 : 여기에

이 파일에 t 쓰기 않는 코드에 최소한의 변화입니다 예외에 관계없이

그러나 이것은 직렬화에서 먼 길입니다. Java 에 자체 이진 직렬화가 있습니다 (ObjectOutputStreamObjectInputStream 참조). 개인적으로는 클래스의 변경에도 불구하고 매우 취약 할 수 있으므로 일반적으로 이러한 일련의 직렬화는 피합니다. 이진 직렬화를 위해 Thrift 또는 프로토콜 버퍼를 사용하거나 XML, JSON 또는 기타 사람이 읽을 수있는 형식으로 직렬화하는 것과 같이 직렬화에 대한 다양한 방법이 있습니다.

+0

파일은 't'에 대해 1 바이트를 가지며, 그 뒤에 9 개의 null '\ 0'바이트가옵니다. 그것이 의도 한 것이 확실하지 않습니다. –

+0

@Peter : 필자는 * 일부 데이터를 디스크에 쓰도록 원본 코드를 가져 오려고했습니다. 궁극적 인 목적이 더 완전한 직렬화를 목표로했기 때문에, 나는 대답의 마지막 부분에서 그것을 논의했다. –

0

당신은

seek(position) 
b = read(length) 

그런 다음 B는 길이를 바이트의 배열 될 것입니다 수 있습니다.

죄송합니다. 다시 읽기를 원하면 읽고 쓰는 것이 아니라 찾고 있습니다.

-1

똑같은 간단한 버전이 있습니다.

byte[] bytes = new byte[10]; 
bytes[1] = 't'; 

FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

웹의 파일에서 byte []를 읽거나 쓰는 방법에 대한 많은 예제가 있습니다. google을 시도하십시오.

+2

컴파일하는 동안 바이트의 범위에있는 char 상수를 사용하기 때문에 약간의 우발적 인 경우가 있습니다. 바이트 배열에 직접 * 문자 *를 저장하려고합니다 (특정 유형의 특정 인코딩 또는 바이트 배열을 래핑하는 char 버퍼)은 정말 나쁜 생각입니다. –