我需要在"ISO-8859-1“中编码我的文件。我知道怎么用这样的阅读器做这件事:
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(src), "ISO-8859-1"))
但我想问的是如何像这样编码DataInputStream。
我现在的解密:
DataInputStream dit = new DataInputStream(new BufferedInputStream(
new FileInputStream(src)))
我更喜欢一种解决方案,其中编码参数在解密。我想要读的数据是用DataOutputStream编写的。
DataStreams的导入方法和导出方法:
public void importDST(String src) throws FileNotFoundException, IOException{
try (DataInputStream dit = new DataInputStream(new BufferedInputStream(new FileInputStream(src)))) {
while(dit.available() > 0) {
pupils.add(new Pupil(dit.readInt(), dit.readInt(), dit.readUTF(), dit.readUTF(), dit.readChar(),
dit.readUTF(), dit.readInt(), dit.readInt(), dit.readInt(), dit.readUTF(), dit.readUTF(), dit.readUTF(), dit.readUTF(),
dit.readUTF(), dit.readUTF()));
}
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
}
}
public void exportDST(String dest, ArrayList<Pupil> pupils) throws FileNotFoundException, IOException{
this.pupils = pupils;
try (DataOutputStream dot = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest)))) {
for (Pupil p : this.pupils) {
dot.writeInt(p.getId());
dot.writeInt(p.getNumber());
dot.writeUTF(p.getFirstname());
dot.writeUTF(p.getLastname());
dot.writeChar(p.getGender());
dot.writeUTF(p.getReligion());
dot.writeInt(p.getDay());
dot.writeInt(p.getMonth());
dot.writeInt(p.getYear());
dot.writeUTF(p.getStreet());
dot.writeUTF(p.getPlz());
dot.writeUTF(p.getLocation());
dot.writeUTF(p.getShortName());
dot.writeUTF(p.getClassName());
dot.writeUTF(p.getKvLastname());
}
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
}
}
班级学生:
public class Pupil implements Serializable{
private int id;
private int number;
private String firstname;
private String lastname;
private char gender;
private String religion;
private int day;
private int month;
private int year;
private String street;
private String plz;
private String location;
private String shortName;
private String className;
private String kvLastname;
public Pupil() {}
public Pupil(int id, int number, String firstname, String lastname, char gender,
String religion, int day, int month, int year, String street, String plz, String location,
String shortName, String className, String kvLastname) {
this.id = id;
this.number = number;
this.firstname = firstname;
this.lastname = lastname;
this.gender = gender;
this.religion = religion;
this.day = day;
this.month = month;
this.year = year;
this.street = street;
this.plz = plz;
this.location = location;
this.shortName = shortName;
this.className = className;
this.kvLastname = kvLastname;
}
}
发布于 2018-09-17 11:33:38
我绕过这个问题,只写和读Ints和Bytes,而不是String。我读取字节数组,并使用它的编码创建了一个新字符串。以下是修改后的代码:
阅读:
public void importDST(String src) throws IOException{
try (DataInputStream dit = new DataInputStream(new BufferedInputStream(new FileInputStream(src)))) {
while (dit.available() > 0) {
Pupil p = new Pupil();
byte[] arr;
int len;
p.setId(dit.readInt());
p.setNumber(dit.readInt());
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setFirstname(new String(arr, "ISO-8859-1"));
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setLastname(new String(arr, "ISO-8859-1"));
p.setGender(dit.readChar());
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setReligion(new String(arr, "ISO-8859-1"));
p.setDay(dit.readInt());
p.setMonth(dit.readInt());
p.setYear(dit.readInt());
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setStreet(new String(arr, "ISO-8859-1"));
p.setPlz(dit.readInt());
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setLocation(new String(arr, "ISO-8859-1"));
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setShortName(new String(arr, "ISO-8859-1"));
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setClassName(new String(arr, "ISO-8859-1"));
len = dit.readInt();
arr = new byte[len];
dit.readFully(arr);
p.setKvLastname(new String(arr, "ISO-8859-1"));
pupils.add(p);
}
}
}
写作:
public void exportDST(String dest, ArrayList<Pupil> pupils) throws IOException{
this.pupils = pupils;
try (DataOutputStream dot = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest)))) {
for (Pupil p : pupils) {
dot.writeInt(p.getId());
dot.writeInt(p.getNumber());
dot.writeInt(p.getFirstname().length());
dot.writeBytes(p.getFirstname());
dot.writeInt(p.getLastname().length());
dot.writeBytes(p.getLastname());
dot.writeChar(p.getGender());
dot.writeInt(p.getReligion().length());
dot.writeBytes(p.getReligion());
dot.writeInt(p.getDay());
dot.writeInt(p.getMonth());
dot.writeInt(p.getYear());
dot.writeInt(p.getStreet().length());
dot.writeBytes(p.getStreet());
dot.writeInt(p.getPlz());
dot.writeInt(p.getLocation().length());
dot.writeBytes(p.getLocation());
dot.writeInt(p.getShortName().length());
dot.writeBytes(p.getShortName());
dot.writeInt(p.getClassName().length());
dot.writeBytes(p.getClassName());
dot.writeInt(p.getKvLastname().length());
dot.writeBytes(p.getKvLastname());
}
}
}
谢谢你的回复!
发布于 2018-09-16 07:19:17
至于ObjectInputStream,文档指出
ObjectInputStream反序列化以前使用ObjectOutputStream编写的原始数据和对象。
此外,请注意:
只有支持java.io.Serializable或java.io.Externalizable接口的对象才能从流中读取。
也就是说,读取的数据以前已经使用ObjectOutputStream序列化(或外部化),并给出实现可序列化(或可扩展)的对象。因此,您将处理readObject
和可序列化对象的“写对象”方法中的任何字符串属性的字符集编码。
至于DataInputStream,请参见以下答案:DataInputStream and UTF-8
在从读取字节创建字符串时,必须指定编码。
发布于 2018-09-16 08:43:41
你的问题没什么意义。
流模型字节流。它们没有字符编码,它们只是字节。
读者阅读字符流。这些最终也是字节流,但是有一个字符编码,说明如何将这些字节转换为字符。因此,能够在构造函数中指定此编码是有意义的。
DataInputStream
s是Stream
s:它们读取二进制代码,因此没有字符编码。
https://stackoverflow.com/questions/52355416
复制