Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataInputStream编码

我需要在"ISO-8859-1“中编码我的文件。我知道怎么用这样的阅读器做这件事:

代码语言:javascript
运行
AI代码解释
复制
BufferedReader br = new BufferedReader(new InputStreamReader(
            new FileInputStream(src), "ISO-8859-1"))

但我想问的是如何像这样编码DataInputStream。

我现在的解密:

代码语言:javascript
运行
AI代码解释
复制
DataInputStream dit = new DataInputStream(new BufferedInputStream(
            new FileInputStream(src)))

我更喜欢一种解决方案,其中编码参数在解密。我想要读的数据是用DataOutputStream编写的。

DataStreams的导入方法和导出方法:

代码语言:javascript
运行
AI代码解释
复制
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;
    }
}

班级学生:

代码语言:javascript
运行
AI代码解释
复制
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;
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-17 11:33:38

我绕过这个问题,只写和读Ints和Bytes,而不是String。我读取字节数组,并使用它的编码创建了一个新字符串。以下是修改后的代码:

阅读:

代码语言:javascript
运行
AI代码解释
复制
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);
        }
    }
}

写作:

代码语言:javascript
运行
AI代码解释
复制
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());
        }
    }
}

谢谢你的回复!

票数 0
EN

Stack Overflow用户

发布于 2018-09-16 07:19:17

至于ObjectInputStream,文档指出

ObjectInputStream反序列化以前使用ObjectOutputStream编写的原始数据和对象。

此外,请注意:

只有支持java.io.Serializable或java.io.Externalizable接口的对象才能从流中读取。

也就是说,读取的数据以前已经使用ObjectOutputStream序列化(或外部化),并给出实现可序列化(或可扩展)的对象。因此,您将处理readObject和可序列化对象的“写对象”方法中的任何字符串属性的字符集编码。

至于DataInputStream,请参见以下答案:DataInputStream and UTF-8

在从读取字节创建字符串时,必须指定编码。

票数 0
EN

Stack Overflow用户

发布于 2018-09-16 08:43:41

你的问题没什么意义。

流模型字节流。它们没有字符编码,它们只是字节。

读者阅读字符流。这些最终也是字节流,但是有一个字符编码,说明如何将这些字节转换为字符。因此,能够在构造函数中指定此编码是有意义的。

DataInputStreams是Streams:它们读取二进制代码,因此没有字符编码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52355416

复制
相关文章
centos7升级内核从3到4或从3到5
//升级内核,参考https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 里显示的 elrepo-release的版本进行如下第2步的安装
Windows技术交流
2019/12/25
1.4K0
1284 2 3 5 7的倍数
1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。 Input 输入1个数N(1 <= N <= 10^18)。 Output 输出不是2 3 5 7的倍数的数共有多少。 Input示例 10 Output示例 1 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!
Angel_Kitty
2018/04/08
9200
centos7内核升级最新BBR内核
CENTOS7作为常用的服务器系统,其正式版的内核都是相当保守的。以下介绍以下升级最新版本的内核方法,目的是为了实现内核的BBR功能,改善CENTOS7的网络功能
Zach
2019/12/30
3.8K0
CentOS 7 升级 Linux 内核
升级 CentOS 内核参考资料 1 升级 CentOS 内核参考资料 2 通过 /proc 虚拟文件系统读取或配置内核 Linux 内核官网 CentOS 官网
全栈程序员站长
2022/09/15
4.1K0
Centos 7 升级系统内核
我们使用 Linux 来表示整个操作系统,但严格地来说,Linux 只是个内核。各种发行版(RedHat、ubuntu、CentOS等)是一个完整功能的系统,它建立在内核之上,具有各种各样的应用程序工具和库。
玖柒的小窝
2021/12/09
1.5K0
5月7日,带您揭秘数据库内核技术
数据库内核技术是数据库的底层技术根基,腾讯云数据库在基础架构领域上一直坚持前沿技术探索与实际落地应用相结合,持续提升产品性能,助力企业国产化升级,推动国产数据库发展行稳致远。 近年来,腾讯云数据库积极拥抱云原生和国产化的趋势,致力于发展自研数据库技术,帮助全行业用户降低上云成本。其中腾讯云TDSQL已被3000多家来自金融、公共服务和电信垂直行业的客户采用,中国十大银行中的六家都应用了该产品。 5月7日19:00-21:40,腾讯云数据库"DB  TALK"系列技术分享会第二期“数据库内核技术探秘”专场即
腾讯云数据库 TencentDB
2022/04/26
8430
5月7日,带您揭秘数据库内核技术
【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
由于暴力解法的算法执行效率很低,需要重复遍历 1000 次,自然效率低下。我们只需要枚举 3 的倍数之和、5 的倍数之和,最后减去它们的最小公倍数之和,便可节省不少时间
攻城狮杰森
2022/06/03
1.3K0
【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
Windows内核开发-3-内核编程基础
这里会深入讲解kernel内核的API、结构体、和一些定义。考察代码在内核驱动中运行的机制。最后把所有知识合在一起写一个有用的驱动。
全栈程序员站长
2022/09/06
1.7K0
Windows内核开发-3-内核编程基础
CentOS7 升级最新内核
yum 方式升级到最新版 导入 elrepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm 列出可用的内核相关包 # kernel-lt:长期支持版本,用于修复旧版内核的 BUG,这些内核只会修复重大 BUG,并且不会频繁发布版本。 # kernel-ml:最新稳定版本 yum --d
陳斯托洛夫斯記
2022/10/27
2.4K0
CentOS7 升级最新内核
CentOS7修改内核版本
因为研究测试fabric需要安装docker,而docker又对linux内核版本有要求,因此对测试的机器内核升级,以下为整理的内核升级方法步骤,忘指正。
用户4988376
2021/07/21
2K0
centos7 删除无用内核
正常情况有两个启动项,一个是“正常启动”,另一个是“救援模式启动”(rescue)。 如果启动项多于2个,说明当前系统有旧内核未删除。原因是CentOS更新后不会自动删除旧内核。 默认以新内核启动,可以在启动选项中临时选择,也可以修改配置永久指定。
herve
2018/09/20
2.6K0
CentOS 7内核升级操作参考
CentOS(Community Enterprise Operating System)是Linux发行版之一,它由来自于Red Hat Enterprise Linux(RHEL)依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用[1]。自从红帽公司单方面宣布终止CentOS的开发后,我们腾讯云的用户也逐步开始将应用迁移到其它操作系统上。由于CentOS 7的维护终止日期在2024年6月30日,距离当前还有一段时间,所以还有少量客户在继续使用着该版本。
dinghailong
2023/01/06
5.5K0
centos7 内核如何升级
需求:由于客户容器化的需要,需要将当前的操作系统升级为5.10.7的版本。 内核升级操作步骤如下: 步骤一:载入公钥、安装elrepo rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 步骤二、载入elrepo-kernel元数据 yum --disablerepo=\* --enablerepo
Linux运维技术之路
2022/06/07
2.6K0
PHP7内核剖析.epub
PHP作为最流行的语言之一,自第一个版本发布至今的二十几年里经历了多次重大改进,PHP7版本最大的特色在于其性能上的突破,比PHP5快了一倍。目前PHP7已经得到了广泛应用,越来越多的项目从PHP5迁移到了PHP7。目前,关于PHP内核的资料非常有限,《PHP7内核剖析》以当前最为流行的PHP7版本为基础,系统性地、尽可能详细地介绍PHP语言底层的实现,旨在帮助更多的开发者进一步理解PHP,参与到PHP的实现中,为未来PHP的发展贡献一份力量!全书内容主要包括PHP数据类型的实现、PHP的编译及执行、PHP内存的管理、函数及面向对象的实现、PHP基础语法的实现,以及PHP扩展的开发。《PHP7内核剖析》适用于有一定C语言基础的PHP高级工程师,或者想了解PHP7的内部实现、扩展开发的工程师。
用户3157710
2019/03/20
1.4K0
PHP7内核剖析.epub
centos7 选定默认启动内核,及删除无用内核
(adsbygoogle = window.adsbygoogle || []).push({});
拓荒者
2019/03/11
1.3K0
如何查看linux系统内核版本_centos7内核版本
该命令适用于所有Linux系统,会显示出完整的版本信息,包括Linux系统的名称,如Debian、Ubuntu、CentOS等,和对应的版本号,以及该版本的代号,例如在Debian 8中将会显示代号jessie。
全栈程序员站长
2022/09/25
7.4K0
centos7 选定默认启动内核,及删除无用内核
(adsbygoogle = window.adsbygoogle || []).push({});
拓荒者
2019/05/31
1.2K0
PHP内核之旅-5.强大的数组
一、数组的内部结构 1.底层实现为散列表(HashTable,也称作哈希表) 2.散列表的概念: 是根据关键码值(Key value)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。复杂度为O(1)。 文件路径\Zend\zend_types.h _zend_array结构: 1 typedef struct _zend_array zend_array; 2 typedef struct _zend_arra
悟空聊架构
2018/06/26
4750
3.安装PHP5和PHP7
这个路径解压处理虽然不报错,但是没有解压过程,echo查看不报错。==--因为这里没有-v==
py3study
2020/01/08
9690
LAMP(3)安装PHP5、安装PHP7
2.下载包: wget http://cn2.php.net/distributions/php-5.6.30.tar.gz
py3study
2020/01/17
1.1K0

相似问题

音乐下载不在这里

10

为傻瓜创建Ubuntu网络

10

为什么我的化名不在Zsh工作?

20

为什么USB不在非UEFI模式下工作?

20

为什么captchas不在UBUNTU浏览器中工作?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档