小编Mys*_*per的帖子

卷曲引用导致Java Scanner hasNextLine()为false - 为什么?

我一直遇到一个问题,让java.util.Scanner读取我在记事本中保存的文本文件,即使它与其他人一起工作正常.基本上,当它试图读取问题文件时,它会完全空出来 - hasNextLine()为false,缓冲区为空等等.我把它缩小到它甚至不会读取第一行的事实是文件中任何位置的卷曲引号.没有异常被抛出.请注意,同一文件上的BufferedReader没有问题.

try {        
    int count = 0;
    Scanner scanner = new Scanner(new File("C:/myfile.txt"));

    while (scanner.hasNextLine()) {
        count++;
        scanner.nextLine();
    }

    scanner.close();
    System.out.print(count);

    count = 0;
    BufferedReader reader = new BufferedReader(new FileReader("C:/myfile.txt"));

    while (reader.readLine() != null) {
        count++;
    }

    reader.close();
    System.out.print(count);
}
catch(IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码,读取一个只包含单个卷曲引号的文件,打印出"01".搜索谷歌让我试试这个:

Scanner scanner = new Scanner(new File("C:/myfile.txt"), "ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)

这使它工作(即它打印出"11").我还注意到,如果我进入记事本并执行另存为...底部的默认编码是"ANSI".如果我将其更改为"UTF-8"并保存文件,则扫描仪(没有编码)也可以.如果我告诉扫描仪"UTF-8",那么可以理解的是,只有当我保存为UTF-8时它才有效,但是"ISO-8859-1"似乎使其工作,即使我将其保存为"ANSI".

所以,我知道它与文件编码有关,但问题是我对文件编码一无所知.我对"ISO-8859-1"的含义非常模糊; 无论我如何保存文件,为什么它会使它工作?为什么BufferedReader无论如何都能正常工作?

编辑:

下面的链接/评论确实帮助我指明了正确的方向!我想我已经明白了.

首先,在记事本中:

  • "ANSI"是CP1252
  • "Unicode"是UTF-16LE
  • "UTF-8"是......好吧,UTF-8

在十六进制中,卷曲撇号表示为:

  • CP1252:92
  • UTF-16LE:1920
  • UTF-8:E2 80 99

根据Charset.defaultCharset(),我在我的系统上使用的默认编码是UTF-8.因此,当我以UTF-8保存文件时,扫描仪知道会发生什么.但是,当我在CP1252中保存文件时,它一旦达到"92"就会被阻塞,因为它不是表示该编码中字符的有效方式.只要文件中没有任何这样的字符,它就可以正常工作 - "hello world"的十六进制在CP1252和UTF-8中都是相同的,并且不会导致问题.

UTF-8不能与UTF-16文件一起使用,因为它不知道如何处理字节顺序标记("FFFE"),无论文件中有什么字符.

另一方面,当我将扫描仪设置为CP1252或ISO-8859-1时,它更宽容.注意,它并不一定正确地解释字符,但没有什么可以阻止它识别文件中的行并循环. …

java encoding utf-8

12
推荐指数
1
解决办法
2601
查看次数

如何在基于DNN的Web API上处理安全性/身份验证

我正在为DotNetNuke 6网站构建REST API,利用DNN基于MVC的服务框架.但是,我没有任何身份验证背景,所以我甚至不确定从哪里开始.

基本上,我们希望我们的客户能够对其门户网站的数据进行GET请求,并且我们希望一些客户端(但不是所有客户端)能够对其用户数据发布简单更新.

我一直在努力寻找信息,但问题是我不确定我在寻找什么.DNN有不同的登录和角色,但我不确定他们是否或如何参与.我听说过像oAuth这样的事情,但我对它的理解是最基本的.我不知道这是否是我需要的,以及它是否或如何适用于DNN.谁能指出我正确的方向?

更新:根据以下答案,将其与模块和进一步的研究结合起来,这就是我所做的:

我为这项服务创建了一个模块,我为它添加了两个特殊权限:"APIGET"和"APIPOST".我将这些分配给了DNN中的一些测试角色/测试帐户.我编写了一个自定义authorize属性,给定模块ID,检查当前用户是否具有必要的权限(通过角色或直接).据我所知,标签ID在我的情况下是无关紧要的.

它似乎既可以使用Web浏览器(基于我登录的DNN帐户),也可以使用php脚本发送带有帐户用户名/密码的HTTP请求.

授权属性:

using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Portals;
using DotNetNuke.Security;
using DotNetNuke.Security.Permissions;
using System.Web;

public class MyAuthorize : DotNetNuke.Web.Services.AuthorizeAttributeBase
{
    public const string AuthModuleFriendlyName = "MyAuthModule";
    public const string GETPermission = "APIGET";
    public const string POSTPermission = "APIPOST";

    public string Permission { get; set; }

    protected override bool AuthorizeCore(HttpContextBase context)
    {
        ModuleController mc = new ModuleController();

        ModuleInfo mi = mc.GetModuleByDefinition(PortalController.GetCurrentPortalSettings().PortalId, AuthModuleFriendlyName);

        ModulePermissionCollection permCollection = mi.ModulePermissions;

        return ModulePermissionController.HasModulePermission(permCollection, Permission);
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:("mytest"是GET和POST的端点)

public class MyController …
Run Code Online (Sandbox Code Playgroud)

dotnetnuke restful-authentication

8
推荐指数
2
解决办法
8196
查看次数