Java 如何将一个带"\n"(这是一个字符)的字符串写入文件不换行?

ueaner 发布于 2013/08/07 00:45
阅读 7K+
收藏 0

Java 如何将一个带"\n"(这是一个字符)的字符串写入文件不换行?

我们的合作方给了我们一个jar包用于加密字符串,需要加密的字符串有N多个,暂且叫它是一个字符串列表,循环这个字符串列表加密后写入文件(我这里仅拿一个字符串做为测试),要求每个一行,以便他们按行读取进行解密,但事实上使用这个加密方法 SecurityHelper.encrypt() 加密后返回的加密字符串中带有一个 "\n" 字符,合作方说是按字节流的形式写入文件就不会换行了。

写了两个程序,加密后写到文件都是换行的。
本人
由于是做PHP的,还请OSC的大牛们有所指点。

注:SecurityHelper 是合作方提供的 jar 包中的一个加密类。

每个加密字符串中均会产生一个"\n",且 "\n" 不可转义,否则会多出一个字符无法解密。

程序1:

String str = "abc123";
// 字符串加密,返回的加密字符串带有一个 "\n" 字符
String ciphertext = SecurityHelper.encrypt(str);

byte[] b = ciphertext.getBytes("UTF-8");
File file = new File("test.txt");
OutputStream out = new FileOutputStream(file);

out.write(b);
out.flush();
out.close();

$ cat test.txt 
ZRdoEZg4Ubpa1QT2xOmSFGi1OmFaDzRgvLsrXjw1Sz+BJjf8oXjhMoy2t292HrNF0pD13LFn1DOv
3Ze0obxr7w==

程序2:

String str = "abc123";
// 字符串加密,返回的加密字符串带有一个 "\n" 字符
String ciphertext = SecurityHelper.encrypt(str);

ByteArrayInputStream stringInputStream = new ByteArrayInputStream(ciphertext.getBytes("UTF-8"));

BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream("test2.txt"));

int data; 
while((data = stringInputStream.read()) != -1) {
	char ch = (char)data;
	bufferedOutput.write(ch);
}

bufferedOutput.flush();
bufferedOutput.close();

$ cat test2.txt 
GEvlTaaIUpBQqB3Z96dpzCArAAcq7U28Kmgs1v5G+MfWm07aHyzqNGXyfHK1lDvYpv7vAot5SvAO
s2s0up5JFw==

系统环境:

[ueaner@aboutc java]$ cat /etc/redhat-release 
CentOS release 6.4 (Final)  x86_64
[ueaner@aboutc java]$ java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

加载中
2
中山野鬼
中山野鬼
不做java的对你说一句,如果你指望向一个文本文件里写0x0a ,怎么样 都换行,如果你想写进去两个字符, '\','n',那就写字符进去。java不是个独立世界,java的程序,只是在电脑操作系统上的一个软件上跑的一个软件而已。
1
方棱
方棱
读文件的程序正在向你抱怨:你 TMD告诉我,到底什么东西才是换行符?
ueaner
ueaner
回复 @ueaner : 你的话已向合作方转达,很有效
ueaner
ueaner
合作方已准备升级 jar 包,避免加密字符串换行
ueaner
ueaner
你TM项目经理当上瘾了,感谢回答。
0
袁不语
袁不语
看起来像base64。\n是在加密字符串末尾么?会影响解密么?
ueaner
ueaner
不在字符串的末尾,会影响解密
0
永远的幸福
永远的幸福
在读取的时候,定义个缓冲数组,在写的时候直接把你读取到的数组写入。你试试。我猜你问题是在转char的时候会出问题。
ueaner
ueaner
我试试,谢谢
0
姑妄听之
姑妄听之

都是完全一样的内容在磁盘上,你用不同的编辑器打开,就会有不同的解释方法。TEXT编辑器会把\n解释成换行。而其他的非TEXT编辑器就不会了。

你这样写就完全没有问题。换行不是你写入的问题。而是你用文本编辑器打开的问题。如果你用HEX的编辑器打开,就不会有什么换行了。

不过,仅仅看加密后数据的样子,貌似是个Base64的字符串。这种字符串是不会出现非ASCII的字符的。按说不会有\n出现。还是把结果发给做jar的人看看是上策。

ueaner
ueaner
我到公司循环写入,使用 FileIntputStream 读取看是不是会区分字符串中的换行和行尾吧,谢谢
0
ihuotui
ihuotui
貌似就是base64,上次用http传送图片就是靠它了。==结束
0
agateriver
agateriver
\n不是问题,因为别人是按行读取的,所以在写那个加密函数的时候自动加了一个\n。你写入加密字符的时候就不要再“多”写一个\n了,用字节流写入就行。换句话说,你不要再画蛇添足多写一个\n
ueaner
ueaner
/n 属于加密字符串中的一部分,不能用做行尾
0
ueaner
ueaner
提问者追问:readline 读取到的行尾是不是和 \n 没有什么关系?
ueaner
ueaner
\n , \r ,\r\n 都算行尾
0
chuangyu
chuangyu

@中山野鬼 说的是对的,你要搞明白要存入文件的字符是一个\和一个n还是转义字符“\n”,如果是分开的两个字符则把它们逐个写入文件。

java在处理字符串时,会把连续的“\n”当作转义字符,所以,你应该把它们分开处理。一个简单的方法是把\替换为\\。

chuangyu
chuangyu
回复 @ueaner : 那这个换行就不是你写入的问题了,是读取的问题了。读取机制怎么解释\n字符就出现相应的情况。如果是按照文本方式按行读取,都会默认是换行。
ueaner
ueaner
标题已写名 \n 是一个字符,谢谢
0
徐庆-neo
徐庆-neo

推荐题主将最后一个字符剔除,然后再写入文件。

等需要使用里面的内容的时候,再手动加上 `\n` 就好啦~

返回顶部
顶部