有人可以给我一些关于如何获取未解码的byte []文件名的提示吗? 我想自己做解码。 我已经跟踪了java src代码,但我被本机函数阻止了。 非常感谢!
我的意思是我想要文件名的原始byte [],而不是将其转换为字符串然后将其转换回来。这可能会导致某些文件名使用本机编码但不会使unicode丢失其原始字节。 JAVA总是给我unicode解码的文件名,我不想要它。
我假设我必须从某个地方处理一些文件,而且我并不完全知道它们使用的编码。但是,我只是不希望系统为我做解码。我想自己决定应该使用哪种解码方式。所以我需要文件名的原始byte []。
C / C ++中的解决方案也很受欢迎。
答案 0 :(得分:1)
据我所知,标准Java API不提供任何方法来检索底层操作系统用作“本机”文件名的字节流;所有API都将文件名处理为java.lang.String
,因此采用Unicode格式。
您当然可以使用String.getBytes将String
转换回byte[]
,但这不会为您提供原始表示。我想要获得它的唯一方法是使用JNI和OS原生文件系统API。
实际上,在Windows上,这意味着您可以使用C / C ++代码获取文件名,并通过JNI调用它来获取“真实”文件名。
答案 1 :(得分:0)
很难说出你真正想要实现的目标。通常,如果我们使用文件,我们不会获取文件名,但提供文件名来访问文件。 filename 是一个字节序列,可以在给定的编码后转换为 String 。
要使用特殊编码创建字符串,请使用:
byte[] filenameBytes = getBytesFromWhereEver();
String filename = new String(filenameBytes, "UTF-8");
该示例将字节编码为UTF-8字符串。但是你仍然必须提供文件名,或者至少是它的字节。
答案 2 :(得分:0)
当我发表评论时,在c / c ++中它是微不足道的,我的意思是根据我的经验,c和c ++很少在没有被告知的情况下转换数据,你应该通过什么都不做就得到你想要的东西。
要获取文件名,我希望您必须迭代文件夹的内容。 执行此操作的两种方法是调用FindFirstFile(),然后调用FindNextFile
WIN32_FIND_DATA findData;
HANDLE findFile;
findFile = FindFirstFile (path, &findData);
FindNextFile (findFile, &findData);
或
wpath ourPath(pDirectory);
wdirectory_iterator endIter;
for (wdirectory_iterator iter(ourPath); iter != endIter; ++iter)
{
pContents.push_back(iter->leaf());
}