【问题标题】:Write and read floats from internal storage从内部存储器写入和读取浮点数
【发布时间】:2013-05-28 09:40:31
【问题描述】:

我需要在文件中存储三对浮点数(三点坐标),然后读取它们并进行比较。 我试过这样:

public Path loadPath()
{
    Path path = new Path();
    float x, y;
    try
    {
        FileInputStream fis = new FileInputStream(filePath);
        DataInputStream dis = new DataInputStream(fis);
        for(int i = 0; i < 3; i++)
        {
            x = dis.readFloat();
            y = dis.readFloat();
            path.addCircle(x, y, rad, Path.Direction.CW);
        }
        dis.close();
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }


    return path;
}

public void savePath(Path cPath)
{
    PathMeasure pm = new PathMeasure(cPath, false);
    float coords[] = {0f, 0f};
    try
    {
        FileOutputStream fos = new FileOutputStream(filePath);
        DataOutputStream dos = new DataOutputStream(fos);
        do
        {
            pm.getPosTan(pm.getLength() * 0.5f, coords, null);
            dos.writeFloat(coords[0]);
            dos.writeFloat(coords[1]);
        }
        while(pm.nextContour());
        dos.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

但是DataOutputStream 以二进制格式写入,我在我的文件中得到了这个:

BК CF BК CF BК CF

因此,当DataInputStream 尝试阅读此内容时,会发现一些奇怪的东西。 我也尝试用FileWriter 写,文件内容看起来不错,但我无法正确读取那里的浮点数。

我需要用什么来写/读 floats 属性?

【问题讨论】:

  • SharedPreferences 不够好?
  • DataOutputStream 用于将数据序列化为流(在您的情况下为文件)。无论您传递给它什么,无论是 writeUTF()、writeShort() 还是 writeFloat(),它都会转换为字节流。您是否要求提供具有 1.23、1.01、234.9989 等内容的人类可读文件?
  • @shoe rat,不,SharedPreferences 不接近,因为我以后会用更多的积分
  • @britzl,没关系,以后可以通过任何方式阅读它们
  • 您现在所做的应该可以工作。使用 DataOutputStream 写入并使用 DataInputStream 读取。当你说你得到“BK CF BK CF”等时,你是什么意思?您是在记事本中打开文件吗?

标签: android fileinputstream fileoutputstream datainputstream dataoutputstream


【解决方案1】:

使用 java.util 库中的 Scanner 和 Formatter。 您可以使用此对象创建多种数据类型并将其写入文件。 这是一个例子:

package pckge.name.goes.here;

import java.io.*;
import java.util.*;

public class Main {

    private static Formatter writer;
    private static Scanner input;

    private static void openFileForWriting(String file) {
        try {
            writer = new Formatter(file);
        } catch(Exception e) {
            System.err.println("Couldn't create file!");
        }
    }

    private void openFileForReading(String file) {
        try {
            input = new Scanner(new File(file));
        } catch(Exception e) {
            System.err.println("Couldn't find file!");
        }
    }

    private void closeFileForWriting() {
        writer.close();
    }

    private void closeFileForReading() {
        input.close();
    }

    private void writeFloat(float f) {
        writer.format("%f%n", f);
    }

    private float[] readCooridnates(String xyz) {
        float[] coordinates = new float[2];
        int position = 0;

        while(scanner.hasNext()) {
            switch(xyz) {
            case "x":

                switch(position) {
                case 0:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                case 1:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                default:
                    //Do nothing
                    break;
                }

                break;
            case "y":
                switch(position) {
                case 2:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                case 3:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                default:
                    //Do nothing
                    break;
                }
                break;
            case "z":
                switch(position) {
                case 4:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                case 5:
                    coordinates[position] = Float.parseFloat(scanner.next());
                    break;
                default:
                    //Do nothing
                    break;
                }
                break;
            default:
                //Do nothing
                break;
            }

            position++;
        }

        return coordinates;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2012-06-07
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多