如何读/写用android.util.Base64编码的字符串

如何读/写用android.util.Base64编码的字符串,android,io,base64,fileinputstream,fileoutputstream,Android,Io,Base64,Fileinputstream,Fileoutputstream,我想将一些字符串存储在一个简单的.txt文件中,然后读取它们,但是当我想使用Base64对它们进行编码时,它就不再起作用了:它写得很好,但读取不起作用^^ 写入方法: private void write() throws IOException { String fileName = "/mnt/sdcard/test.txt"; File myFile = new File(fileName); BufferedWriter bW = new BufferedWri

我想将一些字符串存储在一个简单的.txt文件中,然后读取它们,但是当我想使用Base64对它们进行编码时,它就不再起作用了:它写得很好,但读取不起作用^^

写入方法:

private void write() throws IOException {
    String fileName = "/mnt/sdcard/test.txt";
    File myFile = new File(fileName);

    BufferedWriter bW = new BufferedWriter(new FileWriter(myFile, true));

    // Write the string to the file
    String test = "http://google.fr";
    test = Base64.encodeToString(test.getBytes(), Base64.DEFAULT);

    bW.write("here it comes"); 
    bW.write(";");
    bW.write(test);
    bW.write(";");

    bW.write("done");
    bW.write("\r\n");

    // save and close
    bW.flush();
    bW.close();
}
读取方法:

private void read() throws IOException {
    String fileName = "/mnt/sdcard/test.txt";
    File myFile = new File(fileName);
    FileInputStream fIn = new FileInputStream(myFile);

    BufferedReader inBuff = new BufferedReader(new InputStreamReader(fIn));
    String line = inBuff.readLine();
    int i = 0;
    ArrayList<List<String>> matrice_full = new ArrayList<List<String>>();
    while (line != null) {
        matrice_full.add(new ArrayList<String>());
        String[] tokens = line.split(";");

        String decode = tokens[1];
        decode = new String(Base64.decode(decode, Base64.DEFAULT));

        matrice_full.get(i).add(tokens[0]);
        matrice_full.get(i).add(tokens[1]);
        matrice_full.get(i).add(tokens[2]);
        line = inBuff.readLine();
        i++;
    }
    inBuff.close();
}
private void read()引发IOException{
字符串fileName=“/mnt/sdcard/test.txt”;
File myFile=新文件(文件名);
FileInputStream fIn=新的FileInputStream(myFile);
BufferedReader inBuff=新的BufferedReader(新的InputStreamReader(fIn));
String line=inBuff.readLine();
int i=0;
ArrayList矩阵_full=新的ArrayList();
while(行!=null){
matrice_full.add(新的ArrayList());
String[]tokens=line.split(“;”);
字符串解码=令牌[1];
decode=新字符串(Base64.decode(decode,Base64.DEFAULT));
matrice_full.get(i).add(令牌[0]);
matrice_full.get(i).add(令牌[1]);
matrice_full.get(i).add(令牌[2]);
line=inBuff.readLine();
i++;
}
inBuff.close();
}

你知道为什么吗?

你的代码中有几个错误

首先是关于代码的几个注释:

  • 在这里发布时,附加一个帮助其他人调试您的代码。这不是SSCEE,因为它不编译。它缺少几个定义的变量,所以你必须猜出你真正的意思。您还在代码中粘贴了关闭注释标记:
    */
    ,但没有一个开始注释标记
  • 捕获并仅仅抑制异常(如
    read
    方法中的catch块)是一个非常糟糕的主意,除非您真的知道自己在做什么。大多数情况下,它所做的是对你隐藏潜在的问题。至少写入异常的堆栈跟踪是
    catch
  • 为什么不调试它,检查到底输出到目标文件的是什么?您应该学习如何做到这一点,因为这将加快您的开发过程,特别是对于具有难以捕捉问题的大型项目
  • 回到解决方案:

  • 运行程序。它抛出一个异常:

    02-01 17:18:58.171: E/AndroidRuntime(24417): Caused by: java.lang.ArrayIndexOutOfBoundsException
    
    由这里的线路引起:

    matrice_full.get(i).add(tokens[2]);
    
    检查变量
    tokens
    会发现它有
    2
    元素,而不是
    3

  • 因此,让我们打开由
    write
    方法生成的文件。执行此操作将显示此输出:

    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    
    注意这里的断线。这是因为
    Base64.encodeToString()
    在编码字符串的末尾追加了额外的换行符。要生成一行,不需要额外的换行符,请添加
    Base64.NO_WRAP
    作为第二个参数,如下所示:

    test = Base64.encodeToString(test.getBytes(), Base64.NO_WRAP);
    
    注意,您必须删除先前创建的文件,因为它有不正确的换行

  • 再次运行代码。现在,它将创建一个包含正确内容的文件:

    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    
  • 打印
    matrice\u full
    的输出现在给出:

    [
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done],
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done]
    ]
    
    请注意,您没有对代码中
    decode
    变量中的值执行任何操作,因此第二个元素是从文件中读取的该值的Base64表示形式


  • 您的代码中有几个错误

    首先是关于代码的几个注释:

  • 在这里发布时,附加一个帮助其他人调试您的代码。这不是SSCEE,因为它不编译。它缺少几个定义的变量,所以你必须猜出你真正的意思。您还在代码中粘贴了关闭注释标记:
    */
    ,但没有一个开始注释标记
  • 捕获并仅仅抑制异常(如
    read
    方法中的catch块)是一个非常糟糕的主意,除非您真的知道自己在做什么。大多数情况下,它所做的是对你隐藏潜在的问题。至少写入异常的堆栈跟踪是
    catch
  • 为什么不调试它,检查到底输出到目标文件的是什么?您应该学习如何做到这一点,因为这将加快您的开发过程,特别是对于具有难以捕捉问题的大型项目
  • 回到解决方案:

  • 运行程序。它抛出一个异常:

    02-01 17:18:58.171: E/AndroidRuntime(24417): Caused by: java.lang.ArrayIndexOutOfBoundsException
    
    由这里的线路引起:

    matrice_full.get(i).add(tokens[2]);
    
    检查变量
    tokens
    会发现它有
    2
    元素,而不是
    3

  • 因此,让我们打开由
    write
    方法生成的文件。执行此操作将显示此输出:

    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    
    注意这里的断线。这是因为
    Base64.encodeToString()
    在编码字符串的末尾追加了额外的换行符。要生成一行,不需要额外的换行符,请添加
    Base64.NO_WRAP
    作为第二个参数,如下所示:

    test = Base64.encodeToString(test.getBytes(), Base64.NO_WRAP);
    
    注意,您必须删除先前创建的文件,因为它有不正确的换行

  • 再次运行代码。现在,它将创建一个包含正确内容的文件:

    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    
  • 打印
    matrice\u full
    的输出现在给出:

    [
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done],
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done]
    ]
    
    请注意,您没有对代码中
    decode
    变量中的值执行任何操作,因此第二个元素是从文件中读取的该值的Base64表示形式


  • 好的,非常感谢你的建议:)完整的代码比这个长3倍,所以我尝试简化它,可能有点太快了:p好的,当我用记事本在windows上打开文件时,我没有看到Base64添加换行符,我不得不用记事本++来查看它。但即使使用Base64.NO_WRAP和test.trim()它也会不断添加额外的特征线。你知道为什么吗?没有-我已经通过在真实设备上运行代码进行了检查。假设你删除了旧的文件内容,肯定还有其他东西添加了额外的换行符。非常感谢你的建议:)完整的代码比原来的代码长了3倍,所以我尝试简化它,可能速度有点太快:p好的,当我在windows上用记事本打开文件时,我没有看到Base64添加换行符,我必须使用记事本++才能看到它。但即使是Base64.NO_包装和