2016-04-12 44 views
1

İçinde "cool" sözcüğünü içeren bir metin dosyası var. Bu dosyadaki tüm baytları okurum ve bir dizeye dönüştürürüm. Ancak, aynı dizeyi dosyaya yazmak için aynı dizgeyi geri döndürmeye çalıştığım başka bir işlevde, beklediğim şeyi alamıyorum.Java'da dosyaya yazmak için dizeyi geri baytlara nasıl dönüştürebilirim?

Path path = Paths.get(fileName); 
byte[] data = Files.readAllBytes(path); 

String x = new String(); 
for(byte b: data){ 
    x += Byte.toString(b); 
} 
System.out.println(x); 

Çıktı: "cool"

99111111108 

Maalesef Aşağıdaki kod bunun yerine yazar, dosyaya geri "cool" yazmaz bayt dönüştü 99111111108.

str = "99111111108"; 
FileOutputStream C = new FileOutputStream("new.txt"); 
C.write(str.getBytes()); 
C.close(); 
+0

Bu dizeyi şu şekilde oluşturursanız: 'String x = new String (veri," UTF-8 ");' ... programınızın geri kalanı nasıl istediğinizi gösterir mi? – dnault

+0

Hayır, dizeyi getBytes() dışındaki baytlara dönüştürmenin başka bir yolu var mı? – Lui

+1

@Lui - yapabilirsiniz, ancak "99111111108" dizginiz değil - ondalık olarak baytları temsil eden bir dizedir. cool -> [99] [111] [111] [108]. "cool" ı tekrar "bayt" a çevirmeniz gerekiyor, "99111111108" – xpcoffee

cevap

1

Kontrol şuna: https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)

toString

kamu statik dize toString (bayt b)

belirtilen byte temsil eden yeni bir String nesnesi döndürür. sayı tabanı 10.

Parametreler olduğu varsayılır: b - bayt İade dönüştürülecek:

Ayrıca Bkz belirtilen bayt dize temsil: Integer.toString (int)

Sorun, dizeyi byte'lara dönüştürmenizdir, ancak 'a gidip bu baytı bir dize/karaktere dönüştürmek (temel 10 sayı - radix = 10 olarak yorumlanır), bu ascii eşdeğerini almanız anlamına gelir. Her bir karakterden (c = 99, o = 111, o = 111, l = 108) 10 numaralı bir sayıdır. her rakam için sayısal karakter. Dizeyi tekrar bir bayta dönüştürdüğünüzde, sayısal karakter için numaralı bayt için istediğiniz gibi bir bayt için byte alamazsınız.

Aslında neye göre olduğuna bağlı olarak, farklı bir yaklaşım bulmanız gerekecek. Bu, baytlara dönüştürerek göstermeye çalıştığınız net değil, ama gerçekten bir bit-string'e (0s ve 1s için sayısal karakterlerden oluşan bir dize) dönüştürmek istiyorsanız, daha fazla iş yapmanız gerekecektir.

Bir virgül gibi başka bir karakterle oluşturduğunuz dizgiyi (örn. 99,111,111,108) sınırladıysanız, sınırlandırılmış alt dizelerin tamsayılar olduğunu (normal ascii için) varsayabilir ve bunları 'Integer.parseInt (s)' olarak iletebilirsiniz. veya 'Integer.valueOf (s)' ve sonra char için bir dönüşüm yapın ve daha sonra karakterleri bir dizeye oluşturun. Örneğin

:

StringBuilder sb = new StringBuilder(); 

String str = "99,111,111,108"; // result of initial conversion 
String[] sa = str.split(","); 

char ch = ''; 

for(String s : sa) { 
    ch = Integer.parseInt(s); 
    sb.append(ch); 
} 

FileOutputStream fos = new FileOutputStream("new.txt"); 

fos.write(sb.toString().getBytes()); 
fos.close(); 

burada önemli bir not Java için en azından karakter bir karakter bir ascii karakter olarak yorumlanır onlar dışında sadece tam sayılardır, olmasıdır.

Temel ikilem, baytların dizelere dönüştürülmesinin bağlamın kaybolduğu bir yıkıcı işlemidir. Yani Bilgisayar artık orijinal baytlarla ilgili hiçbir şey bilmiyor, sadece yeni oluşturulan dizenin ne olduğunu biliyor. Baytlar ikili veridir, ancak dizeler bir grup karakterdir (genellikle ascii, ancak çeşitli türlerde UTF).

4

Yapılamaz. Sorun, "99111111108" dizgesinde, bir baytın başlatıldığı ve bittiği yerlerin sınırlarının bulunmamasıdır. Başka bir deyişle, bu dizede "9" ilk karakter veya "99" mu?

+0

Altyazıları 99, 111, 111, 108 – Lui

+0

kullanabileceğimi söyleyebilirim. – Lui

2

Bayt değerleri dizeler olarak gösterildiyse, Bayt.valueOf yöntemiyle bunları baytlara dönüştürebilirsiniz. o dnault önerdi gibi sadece

new String(byteArray, encoding); 

ile doğrudan Dizesi'ne veri okumak daha iyi olurdu gibi Bana göre

byte b = getByte(); 
String byteAsString = Byte.toString(b); 
System.out.println(byteAsString); //might print something like '111' 

byte o = Byte.valueOf(byteAsString); 
assertEquals(b,o); //true 

görünmesine rağmen. herhangi bir dize ile Ayrıca sizin döngü içinde char byte döküm doğrudan bir karakteri elde etmek mümkündür

"string".charAt(index); 

ile bir karakteri olsun. Bu

for(byte b: data){ 
    x += (char)b; 
} 
System.out.println(x); 

yapabileceğini Ve bu çok ciddi bir problem olmasına rağmen bu kod, sağlanan örnek girişi verilen "cool" yazdırmak istiyorum ve byte'ın maksimum değerden daha büyük değerlere sahip karakterler kullanırken sorun çalıştırmak olacaktır.