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)
都是完全一样的内容在磁盘上,你用不同的编辑器打开,就会有不同的解释方法。TEXT编辑器会把\n解释成换行。而其他的非TEXT编辑器就不会了。
你这样写就完全没有问题。换行不是你写入的问题。而是你用文本编辑器打开的问题。如果你用HEX的编辑器打开,就不会有什么换行了。
不过,仅仅看加密后数据的样子,貌似是个Base64的字符串。这种字符串是不会出现非ASCII的字符的。按说不会有\n出现。还是把结果发给做jar的人看看是上策。
@中山野鬼 说的是对的,你要搞明白要存入文件的字符是一个\和一个n还是转义字符“\n”,如果是分开的两个字符则把它们逐个写入文件。
java在处理字符串时,会把连续的“\n”当作转义字符,所以,你应该把它们分开处理。一个简单的方法是把\替换为\\。
推荐题主将最后一个字符剔除,然后再写入文件。
等需要使用里面的内容的时候,再手动加上 `\n` 就好啦~