获取input file绝对路径_Java IO1:IO和File

d8490058fb8c03a95219c69e7f13dd7b.png

IO

大多数的应用程序都要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络。IO就是指应用程序对这些设备的数据输入与输出,Java语言定义了许多类专门负责各种方式的输入、输出,这些类都被放在http://java.io包中。

File类

File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件。通过调用File类提供的各种方法,能够完成创建、删除文件、重命名文件、判断文件的读写权限权限是否存在、设置和查询文件的最近修改时间等操作。

File类没有无参构造方法,最常用的是使用下面的构造方法来生成File对象(注意分隔符可以使用"/"和"",但是使用""必须写"",因为涉及转义的问题):

File(String pathName)

pathName指的是文件的路径名

File类中的方法

File定义了很多获取File对象标准属性的方法,写一段代码来看一下:

public static void main(String[] args)
{
    String fileName = "D:" + File.separator + "Files";
    File file = new File(fileName);
    
    if (file.exists() && file.isDirectory()) // 判断路径指向的文件/文件夹是否存在、是否目录
    {
        System.out.println("file是一个文件夹n");
            
        File[] files = file.listFiles(); // 获取目录下的所有文件/文件夹(仅该层路径下)
        System.out.print("路径下有文件:");
        for (File f : files)
        {
            System.out.print(f + "t");
        }
        System.out.println();
            
        System.out.println("files[0]的文件名:" + files[0].getName()); // 获取文件名、文件夹名
        System.out.println("files[0]的文件路径:" + files[0].getPath()); // 获取文件、文件夹路径
        System.out.println("files[0]的绝对路径:" + files[0].getAbsolutePath()); // 获取文件、文件夹绝对路径
        System.out.println("files[0]的父文件夹名:" + files[0].getParent()); // 获取文件父目录路径
        System.out.println(files[0].exists() ? "files[0]的存在" : "files[0]的不存在"); // 判断文件、文件夹是否存在
        System.out.println(files[0].canWrite() ? "files[0]的可写" : "files[0]的不可写"); // 判断文件是否可写
        System.out.println(files[0].canRead() ? "files[0]的可读" : "files[0]的不可读"); // 判断文件是否可读
        System.out.println(files[0].canExecute() ? "file[0]可执行" : "file[0]不可执行"); // 判断文件是否可执行
        System.out.println(files[0].isDirectory() ? "files[0]的是目录" : "files[0]的不是目录"); // 判断文件、文件夹是不是目录
        System.out.println(files[0].isFile() ? "files[0]的是文件" : "files[0]的不是文件"); // 判断拿文件、文件夹是不是标准文件
        System.out.println(files[0].isAbsolute() ? "files[0]的路径名是绝对路径" : "files[0]的路径名不是绝对路径"); // 判断路径名是不是绝对路径
        System.out.println("files[0]的最后修改时间:" + files[0].lastModified()); // 获取文件、文件夹上一次修改时间
        System.out.println("files[0]的大小:" + files[0].length() + " Bytes"); // 获取文件的字节数,如果是一个文件夹则这个值为0
        System.out.println("files[0]的路径转换为URI:" + files[0].toURI()); // 获取文件路径URI后的路径名
            
        if (files[0].exists())
            files[0].delete(); // 删除指定的文件、文件夹
        if (files[1].exists())
            files[1].deleteOnExit(); // 当虚拟机终止时删除指定的文件、文件夹
    }
}

运行结果为:

 file是一个文件夹

路径下有文件:D:Filesbuffered.txt    D:Filesexample.txt    D:FilesInner    D:Filesserializable.txt    D:Filesstream.txt    D:Filestest.txt    
files[0]的文件名:buffered.txt
files[0]的文件路径:D:Filesbuffered.txt
files[0]的绝对路径:D:Filesbuffered.txt
files[0]的父文件夹名:D:Files
files[0]的存在
files[0]的可写
files[0]的可读
file[0]可执行
files[0]的不是目录
files[0]的是文件
files[0]的路径名是绝对路径
files[0]的最后修改时间:1440313521120
files[0]的大小:21 Bytes
files[0]的路径转换为URI:file:/D:/Files/buffered.txt

示例代码应该是比较全面地演示了File的用法,其中有两点值得注意:

1、程序代码的第三行,写"D:/Files"和"D:Files"都是可以的,但像示例代码这么写应该是一种更好的做法,因为这么写使得代码的跨平台型、健壮性更好。"File.separator"会根据不同的操作系统取不同操作系统下的分隔符。其实File还有另一个分隔符pathSeparator,表示":",不过因为Java主要用在Windows和Linux下,Linux下没有盘符的问题,所以一般直接打":"就好了

2、程序代码的第34、第36行,注意一下,删除的如果是一个文件夹的话,文件夹下还有文件/文件夹,是无法删除成功的

最后,再次重申,File是IO流的基础。

原作者:五月的仓颉

原文链接:Java IO1:IO和File

原出处:博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
int main(int argc, const char** argv) { //****************************************获取数据***************************************************** const std::string input_filename = (argc > 1) ? argv[1] : CGAL::data_file_path("C:\\Users\\lwc\\source\\repos\\Project4\\x64\\Release\\output.xyz"); const char* output_filename = (argc > 2) ? argv[2] : "C:\\Users\\lwc\\source\\repos\\Project4\\x64\\Release\\113.xyz"; //输出文件名称 std::vector<PointVectorPair> points; if (!CGAL::IO::read_points(input_filename, std::back_inserter(points), CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()) .normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()))) { std::cerr << "Error: cannot read file " << input_filename << std::endl; return EXIT_FAILURE; } //****************************************点云平滑************************************************* unsigned int k = 5; //邻近点数 double offset_radius = 0.01; CGAL::vcm_estimate_normals<std::vector<PointVectorPair>>(points, offset_radius, k, CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()) .normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>())); //使用vcm算法来获取每个点的法向量,后面的参数指定了我们的点与法向量对于的部分 //********************************************保存数据************************************************* if (!CGAL::IO::write_points(output_filename, points, CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()) .normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()) .stream_precision(17))) return EXIT_FAILURE; std::cout << "计算结束!" << std::endl; return EXIT_SUCCESS; } 我想将此算法改成遍历文件夹应该怎么写
07-20
要实现遍历文件夹并对其中的每个文件进行相同的算法处理,你可以使用文件系统库(如<filesystem>)来获取文件夹中的所有文件名,并使用循环来逐个处理这些文件。 以下是示例代码,演示如何修改算法以遍历文件夹并对每个文件进行处理: ```cpp #include <iostream> #include <filesystem> #include <vector> #include <string> #include <fstream> #include <sstream> #include <CGAL/IO/read_xyz_points.h> #include <CGAL/IO/write_xyz_points.h> #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/property_map.h> #include <CGAL/Point_with_normal_3.h> #include <CGAL/Point_set_3.h> #include <CGAL/compute_average_spacing.h> #include <CGAL/jet_estimate_normals.h> typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point_3; typedef Kernel::Vector_3 Vector_3; typedef CGAL::Point_with_normal_3<Kernel> Point_with_normal; typedef CGAL::Point_set_3<Point_with_normal> Point_set; int main(int argc, const char** argv) { std::string input_folder = "path/to/input/folder"; std::string output_folder = "path/to/output/folder"; // 遍历文件夹中的所有文件 for (const auto& entry : std::filesystem::directory_iterator(input_folder)) { if (entry.is_regular_file()) { std::string input_filename = entry.path().string(); std::string output_filename = output_folder + "/" + entry.path().filename().string(); std::cout << "Processing file: " << input_filename << std::endl; // 读取点云数据 Point_set points; std::ifstream input_file(input_filename); if (!input_file) { std::cerr << "Error: cannot open file " << input_filename << std::endl; continue; } if (!CGAL::read_xyz_points(input_file, points)) { std::cerr << "Error: cannot read file " << input_filename << std::endl; continue; } input_file.close(); // 计算法向量 CGAL::jet_estimate_normals(points.points(), 18); // 保存处理后的点云数据 std::ofstream output_file(output_filename); if (!output_file) { std::cerr << "Error: cannot create file " << output_filename << std::endl; continue; } if (!CGAL::write_xyz_points(output_file, points.points())) { std::cerr << "Error: cannot write file " << output_filename << std::endl; continue; } output_file.close(); std::cout << "Processed file: " << output_filename << std::endl; } } std::cout << "All files processed!" << std::endl; return EXIT_SUCCESS; } ``` 请注意,你需要将`"path/to/input/folder"`替换为实际的输入文件路径,将`"path/to/output/folder"`替换为实际的输出文件路径。在遍历文件夹时,代码将逐个处理每个文件,并将处理后的结果保存在输出文件夹中,文件名保持不变。 这段代码使用了CGAL库的`read_xyz_points`和`write_xyz_points`函数来读取和保存点云数据。如果你的数据格式不是XYZ格式,你需要相应地修改读取和保存函数,并使用适当的文件读写方法。 希望这可以帮助到你!如果你还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值