为什么 path.toString() 的结果在 Linux 上无法显示所有字符,但在 Windows 上却可以

2023-12-28

在我的 Java 代码中,我使用 FileVisitor 遍历文件系统并创建路径结构,然后将其转换为 json 对象以在 html 中呈现。

在 Windows 上运行,即使针对 Linux 文件系统也可以正常运行,在 Linux 上针对相同(现在是本地)文件系统运行时,在路径上调用 toString() 时,它无法正确呈现特殊字符

即 Windows 调试输出

CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte Lôbo- Requiem

并且 html 显示正常

Duarte Lôbo- Requiem

但 linux 调试输出给出

CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte L??bo- Requiem

html 显示为两个带有问号的黑色菱形,而不是 ô char

为什么会发生这种情况,路径是由 FileVisitor 类提供的,因此必须正确构造(即我自己没有破解它),然后我只需在路径上调用 toString() 。

这是字体问题吗?我在 Linux 系统上遇到了一些字体问题,但在这里我只是将字符串返回到 html,所以看不到连接。

可能是编码问题,但我看不到明确设置编码的地方

下面的大量代码,调试显示 Linux 的无效输出位于 createJsonData() 方法中

编辑:我已经修复了日志记录问题,以便输出写入为 UTF-8

  FileHandler fe = new FileHandler(logFileName, LOG_SIZE_IN_BYTES, 10, true);
  fe.setEncoding(StandardCharsets.UTF_8.name());

现在我们看到 Windows 正在正确输出

CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte Lôbo- Requiem

但Linux正在输出

CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte L��bo- Requiem

如果我在 HexEditor 中查看它,它会给出以下输出栗波

4C EF BF BDEF BF BD 62 6F

编辑:部分解决方案

我碰到sun.jnu.encoding 到底是什么? https://stackoverflow.com/questions/1066845/what-exactly-is-sun-jnu-encoding

发现建议添加这个

 -Dsun.jnu.encoding=UTF-8

现在文件显示正常了

不幸的是,如果用户然后单击这样的文件并将其发送回服务器,我现在会收到此错误

java.lang.NullPointerException
    at java.base/sun.nio.fs.UnixPath.normalizeAndCheck(Unknown Source)
    at java.base/sun.nio.fs.UnixPath.<init>(Unknown Source)
    at java.base/sun.nio.fs.UnixFileSystem.getPath(Unknown Source)
    at java.base/java.nio.file.Paths.get(Unknown Source)
    at com.jthink.songkong.server.callback.ServerFixSongs.configureFileMapping(ServerFixSongs.java:59)
    at com.jthink.songkong.server.callback.ServerFixSongs.startTask(ServerFixSongs.java:88)
    at com.jthink.songkong.server.CmdRemote.lambda$null$36(CmdRemote.java:107) 

我尝试添加-Dfile.encoding=UTF-8除了 jnu 选项之外或代替 jnu 选项,这都没有帮助,jnu 选项正是我需要的。

我不应该添加这个未记录的 sun-jnu-encoding 选项,所以看起来服务器在某种程度上被破坏了?

Code

   import com.google.common.base.Strings;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.jthink.songkong.analyse.analyser.Counters;
    import com.jthink.songkong.analyse.general.Errors;
    import com.jthink.songkong.cmdline.SongKong;
    import com.jthink.songkong.fileloader.RecycleBinFolderNames;
    import com.jthink.songkong.server.fs.Data;
    import com.jthink.songkong.server.fs.PathWalker2;
    import com.jthink.songkong.server.fs.State;
    import com.jthink.songkong.ui.MainWindow;
    import com.jthink.songkong.ui.progressdialog.FixSongsCounters;
    import spark.Request;
    import spark.Response;

    import java.io.IOException;
    import java.net.UnknownHostException;
    import java.nio.file.*;
    import java.nio.file.attribute.BasicFileAttributes;
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    import java.util.logging.Level;


    /**
     * Count the number of files that can be loaded, for information purposes only
     */
    public class CreateFolderTree
    {
        private Path treeRoot;

        Set<Path> keys = new HashSet<Path>();


        public static class VisitFolder
                extends SimpleFileVisitor<Path>
        {

            private Set<Path> keys;
            private Integer maxDepth;
            private int depth;

            public VisitFolder(Set<Path> keys, Integer maxDepth)
            {
                this.keys=keys;
                this.maxDepth = maxDepth;
            }

            /**
             *
             * @param dir
             * @param attrs
             * @return
             * @throws IOException
             */
             /*
             * Ignore some dirs
             * @param dir
             * @param attrs
             * @return
             * @throws IOException
             */
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                    throws IOException
            {
                try
                {
                    if (dir.toFile().getName().equals(".AppleDouble"))
                    {
                        return FileVisitResult.SKIP_SUBTREE;
                    }
                    else if (dir.toString().equals("/proc"))
                    {
                        return FileVisitResult.SKIP_SUBTREE;
                    }
                    else if (dir.toString().equals("/dev"))
                    {
                        return FileVisitResult.SKIP_SUBTREE;
                    }
                    else if (RecycleBinFolderNames.isMatch(dir.toFile().getName()))
                    {
                        MainWindow.logger.log(Level.SEVERE, "Ignoring " + dir.toString());
                        return FileVisitResult.SKIP_SUBTREE;
                    }
                    else if (dir.toString().toLowerCase().endsWith(".tar"))
                    {
                        return FileVisitResult.SKIP_SUBTREE;
                    }

                    depth++;

                    if(depth > maxDepth)
                    {
                        depth--;
                        return FileVisitResult.SKIP_SUBTREE;
                    }
                    keys.add(dir);
                    return super.preVisitDirectory(dir, attrs);
                }
                catch(IOException e)
                {
                    MainWindow.logger.warning("Unable visit dir:"+dir + ":"+e.getMessage());
                    return FileVisitResult.SKIP_SUBTREE;
                }
            }


            /**
             *
             * Tar check due to http://stackoverflow.com/questions/14436032/why-is-java-7-files-walkfiletree-throwing-exception-on-encountering-a-tar-file-o/14446993#14446993
             * SONGKONG-294:Ignore exceptions if file is not readable
             *
             * @param file
             * @param exc
             * @return
             * @throws IOException
             */
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
            {

                if (file.toString().endsWith(".tar")) {
                    //We dont log to reports as this is a bug in Java that we are handling not a problem in SongKong
                    MainWindow.logger.log(Level.SEVERE, exc.getMessage());
                    return FileVisitResult.CONTINUE;
                }

                try
                {
                    FileVisitResult result = super.visitFileFailed(file, exc);
                    return result;
                }
                catch(IOException e)
                {
                    MainWindow.logger.warning("Unable to visit file:"+file + ":"+e.getMessage());
                    return FileVisitResult.CONTINUE;
                }
            }

            /**
             * SONGKONG-294:Ignore exception if folder is not readable
             *
             * @param dir
             * @param exc
             * @return
             * @throws IOException
             */
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc)
                    throws IOException
            {
                depth--;
                try
                {
                    FileVisitResult result = super.postVisitDirectory(dir, exc);
                    return result;
                }
                catch(IOException e)
                {
                    MainWindow.logger.warning("Unable to count files in dir(2):"+dir);
                    return FileVisitResult.CONTINUE;
                }
            }
        }

        public CreateFolderTree(Path treeRoot)
        {
            this.treeRoot = treeRoot;
        }

        public String start(int depth)
        {
            VisitFolder visitFolder;
            try
            {

                if(treeRoot==null)
                {
                    for (Path path : FileSystems.getDefault().getRootDirectories())
                    {
                        visitFolder = new VisitFolder(keys, depth);
                        Files.walkFileTree(path, visitFolder);
                    }
                }
                else
                {
                    visitFolder = new VisitFolder(keys, depth);
                    Files.walkFileTree(treeRoot, visitFolder);
                }

                PathWalker2 pw = new PathWalker2();
                for (Path key : keys)
                {
                    //SONGKONG-505: Illegal character in Filepath problem prevented reportFile creation
                    try
                    {
                        pw.addPath(key);
                    }
                    catch (InvalidPathException ipe)
                    {
                        MainWindow.logger.log(Level.SEVERE, ipe.getMessage(), ipe);
                    }
                }
                Gson gson = new GsonBuilder().create();
                return gson.toJson(createJsonData(pw.getRoot()));
            }
            catch (Exception e)
            {
                handleException(e);
            }
            return "";
        }

        public void handleException(Exception e)
        {
            MainWindow.logger.log(Level.SEVERE, "Unable to count files:"+e.getMessage(), e);
            Errors.addError("Unable to count files:"+e.getMessage());
            MainWindow.logger.log(Level.SEVERE, e.getMessage());
            Counters.getErrors().getCounter().incrementAndGet();
            SongKong.refreshProgress(FixSongsCounters.SONGS_ERRORS);
        }

        /**
         * Add this node and recursively its children,  returning json data representing the tree
         *
         * @param node
         * @return
         */
        private Data createJsonData(PathWalker2.Node node)
        {
            Data data = new Data();
            if(node.getFullPath()!=null)
            {
                data.setId(node.getFullPath().toString());
                if(node.getFullPath().getFileName()!=null)
                {
                    MainWindow.logger.severe("AddingNode(1):"+node.getFullPath().getFileName().toString());
                    data.setText(node.getFullPath().getFileName().toString());
                }
                else
                {
                    MainWindow.logger.severe("AddingNode(2):"+node.getFullPath().toString());
                    data.setText(node.getFullPath().toString());
                }
            }
            else
            {
                try
                {
                    data.setText(java.net.InetAddress.getLocalHost().getHostName());
                    data.setId("#");
                    State state = new State();
                    state.setOpened(true);
                    data.setState(state);
                }
                catch(UnknownHostException uhe)
                {
                    data.setText("Server");
                }
            }

            //Recursively add each child folder of this node
            Map<String, PathWalker2.Node> children = node.getChildren();
            if(children.size()>0)
            {
                data.setChildren(new ArrayList<>());
                for (Map.Entry<String, PathWalker2.Node> next : children.entrySet())
                {
                    data.getChildren().add(createJsonData(next.getValue()));
                }
            }
            else
            {
                data.setBooleanchildren(true);
            }
            return data;
        }

        public static String createFolderJsonData(Request request, Response response)
        {
            if(Strings.nullToEmpty(request.queryParams("id")).equals("#"))
            {
                CreateFolderTree cft = new CreateFolderTree(null);
                String treeData = cft.start(1).replace("booleanchildren", "children");
                return treeData;
            }
            else
            {
                CreateFolderTree cft = new CreateFolderTree(Paths.get(request.queryParams("id")));
                String treeData = cft.start(2    ).replace("booleanchildren", "children");
                return treeData;
            }
        }

    }


    import java.nio.file.Path;
    import java.util.Collections;
    import java.util.Map;
    import java.util.TreeMap;

    /** Constructs a tree of folders based on a list of filepaths
     *
     * i.e a give it a list if all folder that  contain files that have been modified and it creates a hierachy
     * that can then be used to generate a data structure for use by jstree
     *
     */
    public class PathWalker2
    {
        private final Node root;


        public PathWalker2()
        {
            root = new Node();
        }

        public Node getRoot()
        {
            return root;
        }

        /**
         * Represent a node on the tree (may/not have children)
         */
        public static class Node
        {
            //Keyed on name and node
            private final Map<String, Node> children = new TreeMap<>();

            private Path fullPath;

            public Node addChild(String name)
            {

                if (children.containsKey(name))
                    return children.get(name);

                Node result = new Node();
                children.put(name, result);
                return result;
            }

            public Map<String, Node> getChildren()
            {
                return Collections.unmodifiableMap(children);
            }

            public void setFullPath(Path fullPath)
            {
                this.fullPath = fullPath;
            }

            public Path getFullPath()
            {
                return fullPath;
            }
        }

        /**
         * @param path
         */
        public void addPath(Path path)
        {
            Node node = root.addChild((path.getRoot().toString().substring(0, path.getRoot().toString().length() - 1)));

            //For each segment of the path add as child if not already added
            for (int i = 0; i < path.getNameCount(); i++)
            {
                node = node.addChild(path.getName(i).toString());
            }

            //Set full path of this node
            node.setFullPath(path);
        }


    }

因此,与往常一样,对于编码问题,调试工作量很大。不仅有很多不同的因素会影响它,而且它们还会在不同的时间影响它,所以首要任务始终是检查where是不是先出错了。

由于该交易与�表明,一旦出错,它就可以继续more错误,如果你尝试从最终结果开始调试,就像从烂洋葱上剥皮一样。


在这种情况下,问题的根源在于操作系统区域设置,该区域设置为POSIX。这个旧标准使您的操作系统表现得像 70 年代的操作系统,ASCII编码和其他过时的细节。这ASCII编码将阻止操作系统理解文件名、文本或任何包含更多外来字符的内容。这会导致奇怪的问题,因为 JVM 本身运行得很好,但任何时候它与操作系统通信(打印到文本文件,要求打开具有特定名称的文件)都有可能损坏,因为操作系统不这样做理解 JVM 在说什么。

就好像有人在跟你说话,每隔一段时间他就会在里面插入一个中文单词。你用英语写下他说的话,但你用“听不懂???”替换每一个中文单词。

语言环境(在/etc/default/locale) 通常包含合理的默认值,但正如我们在这里看到的,您不能总是相信它。对于任何现代系统,您都需要区域设置值,例如en_EN.UTF-8。你永远不想看到POSIX在当今时代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 path.toString() 的结果在 Linux 上无法显示所有字符,但在 Windows 上却可以 的相关文章

  • 使用 Guice 注入类集合

    我正在尝试用 Google Guice 2 0 注入东西 我有以下结构 FooAction implements Action BarAction implements Action 然后我有一个带有以下构造函数的 ActionLibrar
  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 检查 IPv4 地址是否在私有范围内

    在 Python 中 使用 IPy 模块您可以执行以下操作 gt gt gt ip iptype PRIVATE 有没有一个库或简单的方法可以在 Java 中执行相同的操作 似乎不完全是但是InetAddress有一些 isXX 方法 例如
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 为什么我不能将 Collection 转换为 Collection>

    问题的关键是 为什么这会导致编译时错误 List
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • 如何将 .sh 文件与 Cygwin 关联?

    我想通过双击 Windows 中的 sh 文件来在 Cygwin 中运行长 rsync 命令 它必须从文件所在的目录 例如 cygdrive c scripts 开始 以便相对路径起作用 有人得到这个工作吗 注 我刚刚发现here http
  • Chromedriver 不会打开新会话,它会在现有会话中打开新选项卡

    我的代码在某些 PC 上运行正常 但有一个它不会打开新的私人会话 在这种特殊情况下 它会在已打开的同一窗口中加载当前的 chrome 配置文件 我尝试查看一些 stackoverflow 问题 看看其他人是否也遇到过这种情况 但没有成功 尝
  • 在函数声明和定义中使用 noexcept 说明符?

    考虑以下函数 Declaration in the h file class MyClass template
  • 获取 jQuery 集合中最宽的元素

    假设我有一堆 span 具有不同文本内容的元素 我怎样才能获得最广泛的 span jQuery 没问题 我只关心识别跨度 而不关心宽度本身的值 类似的问题是here https stackoverflow com questions 724
  • Spring Mobile - 拦截器未应用?设备为空

    我正在尝试 Spring Mobile 但我似乎无法让基本示例正常工作 我有一种感觉 我错过了一些愚蠢简单的东西 但我不知道它是什么 这是我所拥有的 在 web xml 中
  • Jenkins 电子邮件通知设置

    我正在尝试为我的詹金斯服务器设置构建失败的电子邮件通知 我尝试过的事情 1 使用我公司的 smtp 邮件服务器进行身份验证 不起作用 连接被拒绝 2 设置我自己的 James 邮件服务器 SMTP 服务器 本地主机 身份验证 管理员 管理员
  • Electron 在开发中运行时显示空白屏幕,但在生产中运行

    当我在 CLI 中运行 yarn run electro dev 时 打开http 本地主机 3000 http localhost 3000在浏览器中显示主页 但电子应用程序显示空白 与其他人在生产中遇到问题但在开发中工作的类似问题不同
  • jQuery.Deferred().then,多参数如何解析

    所以我的 API 期望当特定的延迟得到解决时 它会获得 2 个参数 fn done function arg1 arg2 console log arg1 arg2 fail function err console error err 现
  • SQLite 如何查找最常见出现的值

    假设我有一个带有属性 X 的表 A 如何找到出现次数最多的 X 可以有多个具有相同的最高出现次数 IE 表A X a b c c b 我想回来 X b c 我不能在 Sqlite 中使用关键字 ALL 所以我不知所措 我想获取每个 X 的计
  • Laravel-mix 没有构建通知

    我正在使用 Vue js 和 Laravel Mix 当我保存项目时 我没有收到这样的任何通知 我在跑npm run watch 编译时 我的控制台不显示任何错误 警告 我已经检查过webpack mix js for mix disabl
  • 如何在 Chrome 扩展的内容脚本中导入 ES6 模块

    In 铬61 添加了对 JavaScript 中模块的支持 现在我运行的是 Chrome 63 我正在尝试使用import exportChrome 扩展内容脚本中的语法以使用模块 In manifest json content scri
  • 无限滚动 jquery 插件

    我正在尝试在我正在使用 Coldfusion 开发的网站上设置无限滚动 我对 javascript 和 jquery 很陌生 所以我在解决所有这些问题时遇到了一些问题 我的网站是否需要分页才能使用无限滚动插件 或者有没有办法不需要它 为此
  • Boost编译点云库时出现的问题

    我正在尝试在 OSX 10 6 8 上从源代码编译点云库 并且在使用 Boost 库时不断遇到相同的错误 make Linking CXX shared library lib libpcl common dylib Undefined s
  • 找不到 autoconf。请检查 CentOS 中的 autoconf 安装 Xampp

    在 CentOS 中的 XAMPP 中使用 php 配置 memcached 时出现另一个错误 opt lampp bin phpize Configuring for PHP Api Version 20131106 Zend Modul
  • 如何使用 Express 或 Body-Parser 拒绝无效的 JSON 正文

    我正在创建一个仅接受 json 主体类型并使用主体解析器和express 的应用程序 不断出现的问题是 如果我发送无效的 json 正文 那么我的程序将向用户和控制台抛出一个愚蠢的错误 我如何防止此控制台错误并拒绝具有不正确 JSON 正文
  • Angular 2+拦截Command+S的优雅方式

    尝试实现 Command S 的快捷键组合来保存表单 我读过这个 https angular io guide user input https angular io guide user input 但它没有提及任何有关元或命令的信息 尝
  • 从故事板设置的 UINavigationBar 背景颜色与代码设置的颜色不同

    我的应用程序仅适用于iOS 8我正在与XCode 6 1 1 如果我通过故事板设置颜色 设置Bar Tint属性上Navigation Bar部分 所需的颜色是 56 186 145 I used 核心编码实用程序 http www cor
  • AVPlayer Live 流如何获取音频电平计量的电源

    我试图在我的应用程序中显示一个仪表图 它使用 AVPlayer 来传输实时音频流 我知道对于 AVAudioPlayer 有一种方法 尝试了解 AVAudioPlayer 和音频电平计量 https stackoverflow com qu
  • 无法读取未定义的属性 - javascript 类

    我想尝试 mobx 进行反应状态管理 但是 我无法让它工作 我有一个简单的存储 用于存储一个称为计数器的数字 您可以增加 减少它 并增加 x 我有这个文件 store js 用于存储状态 import action makeObservab
  • 为什么 path.toString() 的结果在 Linux 上无法显示所有字符,但在 Windows 上却可以

    在我的 Java 代码中 我使用 FileVisitor 遍历文件系统并创建路径结构 然后将其转换为 json 对象以在 html 中呈现 在 Windows 上运行 即使针对 Linux 文件系统也可以正常运行 在 Linux 上针对相同