作者willy69wu31 (小小吴)
看板java
标题[问题] InputStream「分支」式包装
时间Wed Dec 3 22:36:49 2014
以前曾经写过一支读档程式,用来读取某一用空格分隔的大量资料纯文字档,
首先 FileInputStream,再加 BufferedInputStream,最後 Scanner,code 如下
> // 凭印象写的,没去编译器测过,可能有拼错
> InputStream in = new FileInputStream("scores.txt");
> in = new BufferedInputStream(in);
> Scanner s = new Scanner(in, "UTF-16LE");
这样的确可以每次呼叫 s.next(); 都抓一个值,分别存进特定阵列,这没问题。
但接下来我遇到另一种情形:
有一纯文字档类似 HTTP response,分为 header 和 body,
但结构与 HTTP response 不同,不能用现有函式库处理。
header 本身有固定编码,但其中记载 body 的编码,读完 header 才知道 body 编码。
如果将上面的 code 改成...
> // 凭印象写的,没去编译器测过,可能有拼错
> InputStream in = new FileInputStream("scores.txt");
> in = new BufferedInputStream(in);
> Scanner s1 = new Scanner(in, "UTF-16LE");
> // ...
> // 当 header 经由 s1 读取完毕,已知编码为 Encoding bodyEncoding;
> Scanner s2 = new Scanner(in, bodyEncoding);
这时候 s2 读出来结果根本就不正常,可能是 s1 已经预先 read 掉 in 的很多字元?
曾经想过:重新开启第二个 FileInputStream 再读一遍;
可是好像不够直觉,也无从得知第一个 FileInputStream 到底读多少字元。
请问有人知道这种情况下该怎麽解决比较好吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.173.212.83
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1417617411.A.BA9.html
1F:→ swpoker: 先公布文件格式大概是甚麽样子~例如固定长度?还是... 12/04 12:09
2F:→ realmeat: 看起来好像是处理二进位的资料, 那header都有规范 12/04 12:33
3F:→ realmeat: 这种东西c是超好写, 直接struct装起来就可以用(乱入) 12/04 12:34
全部都是空格分隔,唯一例外是: header 和 body 之间是两个 \n 分隔,无空格
header 可能有其他 metadata,长度不固定,不过全都是纯文字,所以才用 Scanner 处理
※ 编辑: willy69wu31 (114.27.100.206), 12/04/2014 22:59:38