هناك حزمة جافا لقراءة / الخ / ملف المجموعة UNIX؟

StackOverflow https://stackoverflow.com/questions/617165

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد تم تجوب الإنترنت تبحث عن جافا حزمة / فئة من شأنها أن تسمح لي أن تحليل الخ ملف مجموعة UNIX / /. في حين أنه سيكون حقا لن يكون من الصعب جدا أن أكتب هذا من الصفر، وأنا مندهش جدا لا تجد شيئا بالفعل هناك. هناك فئة POSIX باسود (انظر HTTP: //www.bmsi. كوم / جافا / POSIX / مستندات / posix.Passwd.html )، ولكن أنا لا تجد فئة مماثلة ل/ الخ / المجموعة. هل يوجد شيء من هذا القبيل؟

هل كانت مفيدة؟

المحلول

وهيريس قانون بلدي أن tofubeer المحدثة التي I المحدثة مرة أخرى. له لم تجمع. الطبقة InvalidGroupException المفقودة. أيضا، تم تحديده لا صفقة. تحولت EMPTY_LIST إلى emptyList () لتجنب نقص المعايير والثوابت.

package fileutils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class GroupReader2 {
    public static class InvalidGroupException extends Exception {
        private static final long serialVersionUID = 1L;

        public InvalidGroupException(String string) {
            super(string);
        }
    }

    public static GroupReader2 parseGroup(final String groupLine)
            throws InvalidGroupException {
        final String line;
        final String[] parts;

        if (groupLine == null) {
            throw new IllegalArgumentException("groupLine cannot be null");
        }

        line = groupLine.trim();

        if (line.startsWith("#") || line.isEmpty()) {
            return null;
        }

        parts = line.split(":");

        if (parts.length < 3) {
            throw new InvalidGroupException(groupLine
                    + "must be in the format of name:passwd:gid[:userlist]");
        }

        try {
            final GroupReader2 group;
            final String name;
            final String passwd;
            final int gid;
            final List<String> userList;

            name = parts[0];
            passwd = parts[1];
            gid = Integer.parseInt(parts[2]);

            if (parts.length == 4) {
                userList = Arrays.asList(parts[3].split(","));
            } else {
                userList = Collections.emptyList();
            }

            group = new GroupReader2(name, passwd, gid, userList);

            return group;
        } catch (final NumberFormatException ex) {
            throw new InvalidGroupException(groupLine + " gid must be a number");
        }
    }

    private final int gid;
    private final String name;
    private final String passwd;

    private final List<String> userList;

    public GroupReader2(final String nm, final String pw, final int id,
            final List<String> users) {
        name = nm;
        passwd = pw;
        gid = id;
        userList = Collections.unmodifiableList(new ArrayList<String>(users));
    }

    public int getGid() {
        return (gid);
    }

    public String getName() {
        return (name);
    }

    public String getPasswd() {
        return (passwd);
    }

    public List<String> getUserList() {
        return (userList);
    }

    @Override
    public String toString() {
        final StringBuilder sb;

        sb = new StringBuilder();
        sb.append(name);
        sb.append(":");
        sb.append(passwd);
        sb.append(":");
        sb.append(gid);
        sb.append(":");

        for (final String user : userList) {
            sb.append(user);
            sb.append(",");
        }

        sb.setLength(sb.length() - 1);

        return (sb.toString());
    }
}

نصائح أخرى

وهنا هو رمز قدم جون ألينوود، ولكن جعل أكثر أمانا (تحرير: وأضاف جونز يتغير، بشكل مختلف قليلا، للحفاظ ثم متزامنا مع تعليقات جيد أن نرى كيف شخصين تنفيذ نفس النوع من التعليمات البرمجية.).

ولقد اخترت أن يلقي استثناءات في حالة وجود خط غير صالح، هل يمكن ببساطة تعود فارغة كما فعل في الأصل (وأنا لا أرى نقطة في استخدام ملف يحتوي بيانات خاطئة ...).

والوحيد "يجب أن نفعل" تغييره التفاف قائمة المستخدمين باعتبارها UnmodifableList (أو العودة إلى نسخة جديدة من القائمة) إلا لمستخدم ضار من هذه الطريقة يمكن إضافة أشياء إلى قائمة المستخدمين (دعوة getUserList ومن ثم المضي قدما لإضافة عناصر إلى أو إزالة عناصر من ذلك).

ومنذ الطبقة المجموعة هي ثابتة (جميع المتغيرات المثال نهائية) ليس هناك خوف منهم يتم تغييرها من قبل المتصل.

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Group
{
    private final int gid;
    private final String name;
    private final String passwd;
    private final List<String> userList;

    public static Group parseGroup(final String groupLine)
        throws InvalidGroupException
    {
        final String   line;
        final String[] parts;

        if(groupLine == null)
        {
            throw new IllegalArgumentException("groupLine cannot be null");
        }

        line = groupLine.trim();

        if(line.startsWith("#") || line.isEmpty())
        {
             return null;
        }

        parts = line.split(":");

        if(parts.length < 3)
        {
            throw new InvalidGroupException(groupLine + "must be in the format of name:passwd:gid[:userlist]", line);
        }

        try
        {
            final Group        group;
            final String       name;
            final String       passwd;
            final int          gid;
            final List<String> userList;

            name   = parts[0];
            passwd = parts[1];
            gid    = Integer.parseInt(parts[2]);

            if(parts.length == 4)
            {
                userList = Arrays.asList(parts[3].split(","));
            }
            else
            {
                userList = Collections.emptyList();
            }

            group = new Group(name, passwd, gid, userList);

            return group;
        }
        catch(final NumberFormatException ex)
        {
            throw new InvalidGroupException(groupLine + " gid must be a number", line);
        }
    }

    public Group(final String nm, final String pw, final int id, final List<String> users)
    {
        name     = nm;
        passwd   = pw;
        gid      = id;
        userList = Collections.unmodifiableList(new ArrayList<String>(users));
    }

    public int getGid()
    {
        return (gid);
    }

    public String getName()
    {
        return (name);
    }

    public String getPasswd()
    {
        return (passwd);
    }

    public List<String> getUserList()
    {
        return (userList);
    }

    @Override
    public String toString()
    {
        final StringBuilder sb;

        sb = new StringBuilder();
        sb.append(name);
        sb.append(":");
        sb.append(passwd);
        sb.append(":");
        sb.append(gid);
        sb.append(":");

        for(final String user : userList)
        {
            sb.append(user);
            sb.append(",");
        }

        sb.setLength(sb.length() - 1);

        return (sb.toString());
    }
}

public class InvalidGroupException
    extends Exception
{
     private static final long serialVersionUID = 1L;
     private final String line;

     public InvalidGroupException(final String msg, final String ln)
     {
         super(msg);

         line = ln;
     }

     public String getLine()
     {
         return (line);
     }
}

في حال كنت تنوي تشغيل هذا البرنامج في أي مكان باستثناء الجهاز الخاص بك، والقراءة / الخ / المجموعة ليست فكرة جيدة.

ووفي العالم الحقيقي يستخدم شيكل / LDAP غيرها للحفاظ على كل هذه المعلومات ..

وقد تحتاج إلى التفاف getpwent / الأسرة getgrent مع JNI قد تحصل بعض تنفيذ POSIX جافا الذي يلف هذه.

وعلى أمل أن يساعد ..

وجافا آلة مستقلة ثم أنا لا تحصل بالدهشة لهذا الغرض. للدرجة التي تشير ليست المعيار.

وأعتقد أن نفس السبب الذي يعطي لإخفاء الملف etc / مجموعة / من الجميع، ويمكن أن تعطينا فكرة عن فهم سبب جافا لا توفر ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top